1

是否可以将array.indexOf传递用作searchElement对象。在我的示例中,结果为-1。

   var myArray = [{id: 1, name: 'milan'}, {id: 2, name: 'rome'}];
   var idx = myArray.indexOf({id: 1, name: 'milan'});

如果不可能,它有什么更快的替代方法?也许使用array.filter并返回作为索引的结果值?

4

4 回答 4

2

不,但你可以过滤...

var myArray = [{id: 1, name: 'milan'}, {id: 2, name: 'rome'}],
    equals = function equals(o1, o2) {
      return o1.id == o2.id && o1.name == o2.name;
    },
    idx = {id: 1, name: 'milan'},
    filtered = myArray.filter(function(object, index,array1) {
      return equals(idx, object);
    });
于 2013-10-24T11:29:20.557 回答
2

不,您不能为此使用indexOf:它使用严格相等进行比较,因此:

console.log({id: 1, name: 'milan'} === {id: 1, name: 'milan'}); // false

因为它们是两个不同的对象,包含相同的属性。

在不久的将来,您将能够使用新的 ES6 Array 的方法,例如findand findIndex(例如,它们已经在Firefox Nightly中实现):

var myArray = [{id: 1, name: 'milan'}, {id: 2, name: 'rome'}];
var idx = myArray.findIndex(({id}) => id === 1); // `idx` will be `0`
var item = myArray.find(({id}) => id === 1); // `item` will contains {id: 1, name: 'milan'}

同时,您必须手动执行此操作;如果你想比较所有的属性,如果你创建一个deepEqual函数或类似的东西会更好。

于 2013-10-24T11:32:03.600 回答
1

这是不可能的,因为对象是与引用相等语义进行比较的;作为不同实例的两个相同对象将比较不相等。这意味着无论如何您都需要为比较编写自定义逻辑。

在一般情况下,您可以通过迭代其每个属性并测试每个属性是否存在并且在候选数组元素上是否具有相同的值来找到对象(很可能这需要递归)。根据对象可能包含的内容,比较方法还需要识别数组。

对于极其简单的情况,例如您也可以通过在输入和每个元素上使用并比较结果{id: 1}来快速破解它。JSON.stringify

于 2013-10-24T11:20:31.723 回答
0

array.filter() 方法不返回它只是为过滤数据提供索引的索引,但它总是返回满足 .filter() 条件的数组的整个对象

你可以使用这个逻辑

function getIndex(myArray, element)
{
    for(var i=0; i<array.length; i++) {
        if(element.id == myArray[i].id)
            return i;
    }
    return -1;
}
于 2013-10-24T11:28:18.390 回答