在对象数组中查找完全相同对象的索引的最佳方法(键是动态的)

时间:2016-08-29 11:10:33

标签: javascript object lodash

假设我每次都使用不同的属性和该类型的对象数组动态加载对象:

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 可能非常大。

所以问题是:有没有更好的方法在对象数组中找到完全相同对象的索引?

更新: 我忘了提到没有指定密钥的名称,每次都可以变化。

2 个答案:

答案 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>。将对象和数组对象作为参数传递。如果返回该比较为真,则存储索引。

对象越大越有效。数组越大,效果越慢。您搜索相同对象的时间越慢,这就越有效(您每次都要进行比较而不是一次使用哈希)。

此外,我强烈要求您拥有一组非常大的对象,并且经常搜索但是稀疏地添加或删除它,考虑按顺序排列数组以考虑哈希值。然后使用二叉树搜索该哈希来找到适当的对象,而不是每次从头到尾迭代。