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

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…在循环?


当前回答

好吧,有几种方法可以做到这一点,但让我们从最简单也是最新的方法开始,这个函数叫做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}]

其他回答

看起来在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
jsObjects.find(x => x.b === 6)

中数:

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


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

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

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

如果我理解正确的话,你想在数组中找到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;
});
var result = jsObjects.filter(x=> x.b === 6);

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