如何在数组中找到具有特定值的对象的索引?

时间:2016-07-20 18:53:00

标签: javascript arrays node.js

由于标题不容易获得,我将提供一个例子:



var myObject = {
  "myArray": [{
"hashKey": "someHashkey1",
"data": "someData1"
  }, {
"hashKey": "someHashkey2",
"data": "someData2"
  }, {
"hashKey": "someHashkey3",
"data": "someData3"
  }]
};
        




我有" myObject"包含" myArray",现在我想有效地找到对象的索引,例如hashKey" someHashKey2"。

我可以构建自己的循环来检查数组中的所有元素,但是:

  1. 有内置的方法吗?像indexOf()?

  2. 之类的东西
  3. 是否有针对这种需求的npm工具(我在Node.js中工作)

  4. 有一种有效的方式在这里工作吗?一些不好的方法可以避免?

  5. [编辑:] 我的效率问题是因为我必须为基本上所有的hashKeys做这个操作。我刚发现this question有一个"查找"答案可能有所帮助。仍然在理解这一切......

3 个答案:

答案 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);