假设我每次都使用不同的属性和该类型的对象数组动态加载对象:
var obj = {name: someValue, key: someValue2};
var objArray = [{name: someValue, key: someValue2},{name: someValue, key: someValue3}];
我想找到包含 obj 的 objArray 的索引。 objArray 的某些元素可以具有相同的 name 属性,但具有不同的 key 属性,因此搜索 obj.name 不是一个选项。到目前为止,我想出了这个解决方案:
var keys = [];
_.forEach(Object.keys(obj), function(key) {
keys.push(key, obj[key])
});
var index = _.findIndex(objArray, keys);
这很好用,但我正在寻找性能更好的东西,因为这个 objArray 可能非常大。
所以问题是:有没有更好的方法在对象数组中找到完全相同对象的索引?
更新: 我忘了提到没有指定密钥的名称,每次都可以变化。
答案 0 :(得分:2)
使用Array.prototype.findIndex(),仅当您事先知道要检查的属性并在.findIndex()的回调中对规则进行硬编码时才有效。
一个例子:
var obj = {
name: 'someValue',
key: 'someValue3'
};
var objArray = [{
name: 'someValue',
key: 'someValue2'
}, {
name: 'someValue',
key: 'someValue3'
}];
var index = objArray.findIndex(function(item, index) {
return (item.name === obj.name) && (item.key === obj.key) ? true : false;
});
console.log('index is: ' + index);

下面是另一种方法,基本上它需要一个JavaScript值(您的初始对象)并转换为JSON字符串,并使用该字符串在您的数组中进行搜索。该脚本在没有任何递归的情况下工作,具有任意数量的对象嵌套属性。您的属性的顺序在此脚本中很重要,因为转换为字符串会将其考虑在内。
关于"最佳方式"很难回答,取决于你最佳方式的参数。如果考虑性能,则应考虑对脚本进行基准测试,并使用一些实际数据进行测试。
var obj = {
name: 'someValue',
key: 'someValue2'
},
objArray = [{
name: 'someValue',
key: 'someValue2'
}, {
name: 'someValue',
key: 'someValue3'
}];
var str = JSON.stringify(obj),
index = objArray.findIndex(function(item, index) {
return str === JSON.stringify(item) ;
});
console.log('index is: ' + index);

答案 1 :(得分:0)
我可以想到两种方法:
1。)什么会加快这个过程(特别是如果你有大型数组和大型对象)是为每个对象创建某种唯一键并将其映射到让我们说属性称为:哈希。如果你想保留vanilla,最好的办法就是使用String.hashCode()方法。
迭代对象OWN(检查hasOwnProperty)属性并将其连接成单个字符串,包括属性名称和###,然后是值,然后是%%%。
然后使用属性哈希增强对象,如:
myObj.hash = String.hashCode(StringOfNamesAndValues);
现在使用for迭代你的数组,并将obj.hash与objArray [index]进行比较.hash
一旦他们匹配你喜欢你的对象,存储索引:)
如果您的对象和数组中的对象不必完全相同对象,但只有一个子集需要相同。而是在哈希生成中使用所有属性名称,仅使用您想要相同的属性的名称和值。比较以这种方式制作的哈希 - 瞧!
2。)更粗野的方法是使对象具有相同的功能,它接受2个对象并比较各个属性的所有属性和值。现在使用该函数迭代数组 STRONG>。将对象和数组对象作为参数传递。如果返回该比较为真,则存储索引。
对象越大越有效。数组越大,效果越慢。您搜索相同对象的时间越慢,这就越有效(您每次都要进行比较而不是一次使用哈希)。
此外,我强烈要求您拥有一组非常大的对象,并且经常搜索但是稀疏地添加或删除它,考虑按顺序排列数组以考虑哈希值。然后使用二叉树搜索该哈希来找到适当的对象,而不是每次从头到尾迭代。