数组indexOf与对象?

Jos*_*osh 1 javascript arrays

我知道我们可以在JavaScript中将数组值与indexOf匹配.如果匹配则不会返回-1.

var test = [
    1, 2, 3
]

// Returns 2
test.indexOf(3);
Run Code Online (Sandbox Code Playgroud)

有没有办法匹配对象?例如?

var test = [
    {
        name: 'Josh'
    }
]

// Would ideally return 0, but of course it's -1.
test.indexOf({ name: 'Josh' });
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

由于这两个对象是不同的(尽管可能相同),因此无法使用indexOf.

您可以使用findIndex回调,并根据所需的属性处理匹配.例如,匹配所有可枚举的道具:

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];
    });
});
Run Code Online (Sandbox Code Playgroud)

例:

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);
Run Code Online (Sandbox Code Playgroud)

请注意,这findIndex是在ES2015中添加的,但是完全可以填充.

  • @JoshSpears:它会*有效*.:-)如何*有效*它将取决于他们拥有多少"自己的"属性.2000不是很多对象,即使它们具有20-30个"自己的"属性,如果花费超过几毫秒,我会感到惊讶.实际上,这很容易测试:https://jsfiddle.net/kxt9a4xr/1/在我的机器上,在Chrome上,强迫最坏的情况(对象全部*几乎*匹配,但实际上没有),它是5-7ms.因人而异. (2认同)