比方说,我有一个包含四个对象的数组。
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
有什么方法可以让我通过属性b
的值来获得第三个对象({a: 5, b: 6}
),例如不用for...in
循环?
筛选 "对象的数组,其属性与值相匹配,返回数组。
var result = jsObjects.filter(obj => {
return obj.b === 6
})
见MDN文档中Array.prototype.filter() 。
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
]
let result = jsObjects.filter(obj => {
return obj.b === 6
})
console.log(result)
找到
数组中第一个元素/对象的值,否则返回未定义
。
var result = jsObjects.find(obj => {
return obj.b === 6
})
参见MDN文档中Array.prototype.find()
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
]
let result = jsObjects.find(obj => {
return obj.b === 6
})
console.log(result)
我不知道你为什么反对for循环(估计你是指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];
}
}
.过滤器
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;
}
}
}
}