2015-06-29 7 views
0

У меня есть два объекта, которые я сравниваю. У меня есть массив объектов, и я пытаюсь проверить, содержит ли массив определенный объект. Я думаю, что это нужно найти, но это не так. Вот объект в массиве:Поиск объекта в массиве

Array Object

и здесь объект Ищу:

Match Object

Я использую:

if (collection.indexOf(object) !== -1) { 
 
    //do something 
 
}

И он возвращает индекс -1, хотя мне кажется, что объекты совпадают. Я что-то упустил?

+0

Можете ли вы добавить свой массив и объектные коды в свой вопрос, пожалуйста? –

+0

Возможный дубликат [Сравнение объектов в JavaScript] (http://stackoverflow.com/questions/1068834/object-comparison-in-javascript) –

+0

Возможный дубликат [Найти объект по id в массиве объектов javascript] (http: /stackoverflow.com/questions/7364150/find-object-by-id-in-array-of-javascript-objects) – nils

ответ

0

indexOf() будет работать только для элементарных типов, таких как числа, строки, булевские и т. Д. Он не делает глубокого сравнения для соответствия объектам.

Нечто подобное должно работать:

var found = false; 
arr.forEach(function(_object) { 
    // code to set found to true if _object is what you need 
}); 
// if found is true, your array has your object, else it doesn't 
+1

Вы должны использовать ['some'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some) вместо' forEach'. –

+0

@BaliBalo - Спасибо. Никогда раньше не использовался 'some()'. Но в этом случае это выглядит лучше. – techfoobar

1

попробовать это, если все поля возвращают равно истинный

function testContains(arrayOfObject, lookingObject) 

    var index; 

    for (index = 0; index < arrayOfObject.length; ++index) { 

     var o = arrayOfObject[index]); 

     if(JSON.encode(o)===JSON.encode(lookingObject)) { 

      return true; 
     } 

    } 

    return false; 
} 
+0

Хей. Спасибо, я немного оптимизировал ваш ответ, но вы получили меня в правильном направлении, используя JSON. – andzep

0

Если вы можете использовать Lodash (это очень полезно и стоит на моем взгляде) вы можете использовать _.find: _.find(collection, object)

или если вы хотите знать только, присутствует ли объект в массиве, вы можете сделать : _.includes(collection, object)

0

Я оптимизировал @ ответ Кайзера в однострочник:

var found = obj_list.map(JSON.stringify).indexOf(JSON.stringify(obj)) !== -1; 

Но это будет только работать, если порядок следования объектов то же:

JSON ПРЕДСТАВЛЕНИЕ из obj1 = {'a': 1, 'b': 2} не соответствует obj2 = {'b': 2, 'a': 1}

Но если объект, который вы ищете, был скопирован из списка, тогда тест должен работать.

Также, чтобы принять во внимание, это будет работать только в том случае, если объекты в списке являются простыми объектами, которые могут быть «закреплены».

Смежные вопросы