【问题标题】:array indexOf with objects?带有对象的数组 indexOf?
【发布时间】:2017-03-07 17:02:45
【问题描述】:

我知道我们可以用 JavaScript 中的 indexOf 匹配数组值。如果匹配,则不会返回 -1。

var test = [
    1, 2, 3
]

// Returns 2
test.indexOf(3);

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

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

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

【问题讨论】:

标签: javascript arrays


【解决方案1】:

由于这两个对象是不同的(虽然可能是等价的),所以您不能使用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];
    });
});

例子:

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

请注意,findIndex 是在 ES2015 中添加的,但它是完全可填充的。

【讨论】:

  • 感谢您的意见。我只是希望这在我的数组包含 2000 个对象时有效。
  • @JoshSpears:会有效。 :-) 效率 将取决于他们拥有多少“自己的”属性。 2000 并不是很多对象,即使它们每个都有 20-30 个“自己的”属性,如果花费的时间超过几毫秒,我也会感到惊讶。实际上,这很容易测试:jsfiddle.net/kxt9a4xr/1 在我的机器上,在 Chrome 上,强制最坏的情况(所有对象都几乎匹配,但实际上没有一个匹配),它是 5-7 毫秒。 YMMV。
【解决方案2】:

不,你不能,而且解释很简单。尽管您使用相同的对象字面量,但会创建两个不同的对象。因此,如果您将test 与您在indexOf 中寻找的参考进行比较,那么test 将有另一个提到的对象参考。

【讨论】:

    【解决方案3】:

    这是一种自定义 indexOf 函数。代码只是遍历对象数组中的项目并找到每个项目的名称属性,然后测试您要查找的名称。测试“Josh”返回 0,测试“Kate”返回 1。测试“Jim”返回 -1。

    var test = [
      {
        name: 'Josh'
      },
      {
        name: 'Kate'
      }
    ]
    
    myIndexOf('Kate')
    
    function myIndexOf(name) {
      testName = name;
      for (var i = 0; i < test.length; i++) {
        if(test[i].hasOwnProperty('name')) {
          if(test[i].name === testName) {
            console.log('name: ' + test[i].name + ' index: ' + i);
            return i;
          }
        }
      }
      return -1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2012-01-29
      • 2021-04-23
      • 2022-01-15
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多