带有对象的数组 indexOf ?
2017-03-07
7697
我知道我们可以在 JavaScript 中使用 indexOf 匹配数组值。如果匹配,则不会返回 -1。
var test = [
1, 2, 3
]
// Returns 2
test.indexOf(3);
有没有办法匹配对象?例如?
var test = [
{
name: 'Josh'
}
]
// Would ideally return 0, but of course it's -1.
test.indexOf({ name: 'Josh' });
3个回答
由于这两个对象是不同的(尽管可能等同),因此您不能使用
indexOf
。
您可以将
findIndex
与回调结合使用,并根据所需的属性处理匹配。例如,要匹配所有可枚举的 props:
var target = {name: 'Josh'};
var targetKeys = Object.keys(target);
var index = test.findIndex(function(entry) {
var keys = Object.keys(entry);
return keys.length == targetKeys.length && keys.every(function(key) {
return target.hasOwnProperty(key) && entry[key] === target[key];
});
});
示例:
var test = [
{
name: 'Josh'
}
];
var target = {name: 'Josh'};
var targetKeys = Object.keys(target);
var index = test.findIndex(function(entry) {
var keys = Object.keys(entry);
return keys.length == targetKeys.length && keys.every(function(key) {
return target.hasOwnProperty(key) && entry[key] === target[key];
});
});
console.log(index);
请注意,
findIndex
是在 ES2015 中添加的,但完全可填充。
T.J. Crowder
2017-03-07
不,你不能,解释很简单。尽管你使用相同的对象文字,但会创建两个不同的对象。因此,如果你将
test
与你在
indexOf
中寻找的引用进行比较,它将对提到的对象有另一个引用。
Christos
2017-03-07
这是一种自定义 indexOf 函数。代码只是遍历对象数组中的项目并找到每个项目的 name 属性,然后测试您要查找的名称。测试“Josh”返回 0,测试“Kate”返回 1。测试“Jim”返回 -1。
var test = [
{
name: 'Josh'
},
{
name: 'Kate'
}
]
myIndexOf('Kate')
function myIndexOf(name) {
testName = name;
for (var i = 0; i < test.length; i++) {
if(test[i].hasOwnProperty('name')) {
if(test[i].name === testName) {
console.log('name: ' + test[i].name + ' index: ' + i);
return i;
}
}
}
return -1;
}
Chris Sharp
2017-03-07