假设我有一个包含四个对象的数组:

var jsObjects = [
   {a: 1, b: 2}, 
   {a: 3, b: 4}, 
   {a: 5, b: 6}, 
   {a: 7, b: 8}
];

是否有一种方法,我可以通过属性b的值获得第三个对象({a: 5, b: 6})例如,没有a for…在循环?


对象的过滤器数组,属性与值匹配,返回数组:

var result = jsObjects.filter(obj => {
  return obj.b === 6
})

请参阅Array.prototype.filter()上的MDN文档

const jsObjects = [ {a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8} ] let result = jsObjects。过滤器(obj => { 返回obj。B === 6 }) console.log(结果)

找到数组中第一个元素/对象的值,否则返回undefined。

var result = jsObjects.find(obj => {
  return obj.b === 6
})

请参阅Array.prototype.find()上的MDN文档

const jsObjects = [ {a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8} ] let result = jsObjects。Find (obj => { 返回obj。B === 6 }) console.log(结果)


如果我理解正确的话,你想在数组中找到b属性为6的对象?

var found;
jsObjects.some(function (obj) {
  if (obj.b === 6) {
    found = obj;
    return true;
  }
});

或者如果你使用下划线:

var found = _.select(jsObjects, function (obj) {
  return obj.b === 6;
});

我不知道为什么你反对for循环(大概你指的是for循环,而不是特别针对..in),它们快速且易于阅读。不管怎样,这里有一些选择。

For循环:

function getByValue(arr, value) {

  for (var i=0, iLen=arr.length; i<iLen; i++) {

    if (arr[i].b == value) return arr[i];
  }
}

.filter

function getByValue2(arr, value) {

  var result  = arr.filter(function(o){return o.b == value;} );

  return result? result[0] : null; // or undefined

}

.forEach

function getByValue3(arr, value) {

  var result = [];

  arr.forEach(function(o){if (o.b == value) result.push(o);} );

  return result? result[0] : null; // or undefined

}

另一方面,如果你真的想要for..in,并且想要找到一个带有任何值为6的属性的对象,那么你必须使用for..in,除非你传递名称来检查。

例子

function getByValue4(arr, value) {
  var o;

  for (var i=0, iLen=arr.length; i<iLen; i++) {
    o = arr[i];

    for (var p in o) {
      if (o.hasOwnProperty(p) && o[p] == value) {
        return o;
      }
    }
  }
}

看起来在ECMAScript 6提案中有数组方法find()和findIndex()。MDN还提供了可以包含在所有浏览器中获得这些功能的腻子。

find ():

function isPrime(element, index, array) {
    var start = 2;
    while (start <= Math.sqrt(element)) {
        if (element % start++ < 1) return false;
    }
    return (element > 1);
}

console.log( [4, 6, 8, 12].find(isPrime) ); // undefined, not found
console.log( [4, 5, 8, 12].find(isPrime) ); // 5

findIndex ():

function isPrime(element, index, array) {
    var start = 2;
    while (start <= Math.sqrt(element)) {
        if (element % start++ < 1) return false;
    }
    return (element > 1);
}

console.log( [4, 6, 8, 12].findIndex(isPrime) ); // -1, not found
console.log( [4, 6, 7, 12].findIndex(isPrime) ); // 2

var jsObjects = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8}];

要访问第三个对象,使用:jsObjects[2]; 要访问第三个对象b的值,使用:jsObjects[2].b;


使用underscore.js:

var foundObject = _.findWhere(jsObjects, {b: 6});

如果您正在寻找一个单一的结果,而不是一个数组,我是否可以建议减少?

这里是一个简单的'ole javascript解决方案,如果存在,返回一个匹配的对象,如果不存在,则返回null。

var result = arr.reduce(function(prev, curr) { return (curr.b === 6) ? curr : prev; }, null);

jsObjects.find(x => x.b === 6)

中数:

如果数组中的元素满足提供的测试函数,find()方法将返回数组中的一个值。否则返回undefined。


附注:像find()和箭头函数这样的方法不被旧的浏览器(如IE)所支持,所以如果你想支持这些浏览器,你应该使用Babel编译你的代码。


通过特定的属性值从对象数组中获取第一个对象:

function getObjectFromObjectsArrayByPropertyValue(objectsArray, propertyName, propertyValue) { return objectsArray.find(function (objectsArrayElement) { return objectsArrayElement[propertyName] == propertyValue; }); } function findObject () { var arrayOfObjectsString = document.getElementById("arrayOfObjects").value, arrayOfObjects, propertyName = document.getElementById("propertyName").value, propertyValue = document.getElementById("propertyValue").value, preview = document.getElementById("preview"), searchingObject; arrayOfObjects = JSON.parse(arrayOfObjectsString); console.debug(arrayOfObjects); if(arrayOfObjects && propertyName && propertyValue) { searchingObject = getObjectFromObjectsArrayByPropertyValue(arrayOfObjects, propertyName, propertyValue); if(searchingObject) { preview.innerHTML = JSON.stringify(searchingObject, false, 2); } else { preview.innerHTML = "there is no object with property " + propertyName + " = " + propertyValue + " in your array of objects"; } } } pre { padding: 5px; border-radius: 4px; background: #f3f2f2; } textarea, button { width: 100% } <fieldset> <legend>Input Data:</legend> <label>Put here your array of objects</label> <textarea rows="7" id="arrayOfObjects"> [ {"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6}, {"a": 7, "b": 8, "c": 157} ] </textarea> <hr> <label>property name: </label> <input type="text" id="propertyName" value="b"/> <label>property value: </label> <input type="text" id="propertyValue" value=6 /> </fieldset> <hr> <button onclick="findObject()">find object in array!</button> <hr> <fieldset> <legend>Searching Result:</legend> <pre id="preview">click find</pre> </fieldset>


实现需求的方法:

使用Array.find()方法:

const jsObject = [ {a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8} ]; const filteredResult = jsObject.find((e) => e.b == 6); console.log (filteredResult);

使用Array.filter()方法:

const jsObjects = [ {a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8} ]; const filterObj = jsObjects.filter((e) => e.b == 6); console.log (filterObj [0]);

使用……循环中:

const jsObjects = [ {a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8} ]; for (const i in jsObjects) { 如果(jsObjects[我]。B == 6) { console.log (jsObjects[我]); } }


使用_怎么样?找到(收集、谓语= _。[fromIndex=0])的low -dash从对象数组中通过对象属性值获取对象。你可以这样做:

var o = _.find(jsObjects, {'b': 6});

参数:

collection (Array|Object): The collection to inspect.
[predicate=_.identity] (Function): The function invoked per iteration.
[fromIndex=0] (number): The index to search from.

返回

(*): Returns the matched element (in your case, {a: 5, b: 6}), else undefined.

在性能方面,_.find()更快,因为它只提取第一个具有属性{'b': 6}的对象,另一方面,如果假设你的数组包含多个具有匹配属性集(key:value)的对象,那么你应该考虑使用_.filter()方法。因此,在您的情况下,由于您的数组只有一个具有此属性的对象,我将使用_.find()。


使用find和bind将特定的键值传递给回调函数。

   function byValue(o) { 
       return o.a === this.a && o.b === this.b; 
   };   

   var result = jsObjects.find(byValue.bind({ a: 5, b: 6 }));

参见本文档Array.prototype.find()

例子:

var inventory = [
    {name: 'apples', quantity: 2},
    {name: 'bananas', quantity: 0},
    {name: 'cherries', quantity: 5}
];

function findCherries(fruit) { 
    return fruit.name === 'cherries';
}

console.log(inventory.find(findCherries)); 
// { name: 'cherries', quantity: 5 }

你可以像下面这样使用箭头函数:

var demoArray = [
   {name: 'apples', quantity: 2},
   {name: 'bananas', quantity: 0},
   {name: 'cherries', quantity: 5}
];

var result = demoArray.filter( obj => obj.name === 'apples')[0];
console.log(result);
// {name: 'apples', quantity: 2}

var result = jsObjects.filter(x=> x.b === 6);

会更好,在过滤器中使用return有时你无法得到结果(我不知道为什么)


让这个答案的最佳/最快部分更具可重用性和清晰性:

function getElByPropVal(myArray, prop, val){
    for (var i = 0, length = myArray.length; i < length; i++) {
        if (myArray[i][prop] == val){
            return myArray[i];
        }
    }
}

好吧,有几种方法可以做到这一点,但让我们从最简单也是最新的方法开始,这个函数叫做find()。

当你使用find to时要小心,因为即使是IE11也不支持它,所以它需要被转译…

你有了这个物体

var jsObjects = [
   {a: 1, b: 2}, 
   {a: 3, b: 4}, 
   {a: 5, b: 6}, 
   {a: 7, b: 8}
];

你可以这样写一个函数:

function filterValue(obj, key, value) {
  return obj.find(function(v){ return v[key] === value});
}

然后像这样使用函数:

filterValue(jsObjects, "b", 6); //{a: 5, b: 6}

在ES6中也有缩短版本:

const filterValue = (obj, key, value)=> obj.find(v => v[key] === value);

该方法只返回第一个匹配…,为了获得更好的结果和浏览器支持,你可以使用filter:

const filterValue = (obj, key, value)=> obj.filter(v => v[key] === value);

返回[{a: 5, b: 6}]…

此方法将返回一个数组…

你也可以简单地使用for循环,创建一个这样的函数:

function filteredArray(arr, key, value) {
  const newArray = [];
  for(i=0, l=arr.length; i<l; i++) {
    if(arr[i][key] === value) {
      newArray.push(arr[i]);
    }
  }
 return newArray;
}

像这样叫它:

filteredArray(jsObjects, "b", 6); //[{a: 5, b: 6}]