由于标题不容易获得,我将提供一个例子:
var myObject = {
"myArray": [{
"hashKey": "someHashkey1",
"data": "someData1"
}, {
"hashKey": "someHashkey2",
"data": "someData2"
}, {
"hashKey": "someHashkey3",
"data": "someData3"
}]
};

我有" myObject"包含" myArray",现在我想有效地找到对象的索引,例如hashKey" someHashKey2"。
我可以构建自己的循环来检查数组中的所有元素,但是:
有内置的方法吗?像indexOf()?
是否有针对这种需求的npm工具(我在Node.js中工作)
有一种有效的方式在这里工作吗?一些不好的方法可以避免?
[编辑:] 我的效率问题是因为我必须为基本上所有的hashKeys做这个操作。我刚发现this question有一个"查找"答案可能有所帮助。仍然在理解这一切......
答案 0 :(得分:1)
您只需使用Array.prototype.findIndex即可获得所需的每个项目的索引。
var myObject = {"myArray": [{"hashKey": "someHashkey1", "data": "someData1"}, {"hashKey": "someHashkey2", "data": "someData2"}, {"hashKey": "someHashkey3", "data": "someData3"}] };
console.log(myObject.myArray.findIndex(i => i.hashKey === 'someHashkey2'));

如果大多数时间都在进行搜索调用,那么您可以使用此哈希来检查或访问您的值:
var myObject = {"myArray": [{"hashKey": "someHashkey1", "data": "someData1"}, {"hashKey": "someHashkey2", "data": "someData2"}, {"hashKey": "someHashkey3", "data": "someData3"}] };
hash = Object.create(null);
myObject.myArray.forEach(i => hash[i.hashKey] = i)
console.log('someHashkey2' in hash);
console.log(hash.someHashkey2);

var myObject = {"myArray": [{"hashKey": "someHashkey1", "data": "someData1"}, {"hashKey": "someHashkey2", "data": "someData2"}, {"hashKey": "someHashkey3", "data": "someData3"}] };
var map = new Map;
myObject.myArray.forEach(i => map.set(i.hashKey, i));
console.log(map.has('someHashkey2'));
console.log(map.get('someHashkey2'));

使用map的好处是它允许您将任何内容存储为键而不仅仅是字符串
答案 1 :(得分:0)
如果您有一个哈希键,我建议您将数组转换为一个对象,然后您可以使用这样的哈希键找到该对象:myObject.myArray["someHashkey1"]
var myObject =
{ "myArray" :
{
"someHashkey1":{
"hashKey": "someHashkey1",
"data": "someData1"
},
"someHashkey2":{
"hashKey": "someHashkey2",
"data": "someData2"
}
}
};
console.log(myObject.myArray["someHashkey1"]);

以下是array vs hash object的小型性能测试 正如您所看到的,在对象中的数组中查找相同的键之间存在细微差别。对象快一点。
答案 2 :(得分:0)
每当你想从数组中得到一个(非布尔)值时,你几乎总是想要reduce
:
var index = myObject.myArray.reduce((index, record, i) => {
if (index !== -1 || !('somekey' in record)) {
return index;
} else {
return i;
}
}, -1);
或'高尔夫':
var index = myObject.myArray.reduce((i, x, j) => {i || x.somekey ? i : j},-1);