假设我有一个包含四个对象的数组:
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 jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
是否有一种方法,我可以通过属性b的值获得第三个对象({a: 5, b: 6})例如,没有a for…在循环?
当前回答
让这个答案的最佳/最快部分更具可重用性和清晰性:
function getElByPropVal(myArray, prop, val){
for (var i = 0, length = myArray.length; i < length; i++) {
if (myArray[i][prop] == val){
return myArray[i];
}
}
}
其他回答
参见本文档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 }
如果我理解正确的话,你想在数组中找到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;
});
好吧,有几种方法可以做到这一点,但让我们从最简单也是最新的方法开始,这个函数叫做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}]
var result = jsObjects.filter(x=> x.b === 6);
会更好,在过滤器中使用return有时你无法得到结果(我不知道为什么)
如果您正在寻找一个单一的结果,而不是一个数组,我是否可以建议减少?
这里是一个简单的'ole javascript解决方案,如果存在,返回一个匹配的对象,如果不存在,则返回null。
var result = arr.reduce(function(prev, curr) { return (curr.b === 6) ? curr : prev; }, null);