数组indexOf与对象?

时间:2017-03-07 17:02:46

标签: javascript arrays

我知道我们可以在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' });

3 个答案:

答案 0 :(得分:7)

由于这两个对象是截然不同的(尽管可能相同),因此您无法使用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);




请注意,ES2015中添加了findIndex,但完全可以填充。

答案 1 :(得分:0)

不,你不能,解释很简单。尽管您使用相同的对象文字,但仍会创建两个不同的对象。因此,如果您将test与您在indexOf中查找的引用进行比较,$(function(){ var goals = $('.goal-slider').find('.goal'); for(var i = 0; i < goals.length; i+=4) { goals.slice(i, i+4).wrapAll("<div class='goal-slide'></div>"); } }); 会为所提及的对象提供另一个引用。

答案 2 :(得分:0)

这是一种自定义indexOf函数。代码只是遍历对象数组中的项目,找到每个项目的name属性,然后测试您要查找的名称。测试'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;
}