Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.12.2015, 12:02
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

Не работает indexOf для массива объектов
Доброго времени суток!
Столкнулся с проблемкой: формирую массив объектов, при добавлении нового, хочу проверить, есть ли такой объект в массиве. И если есть - то добавлять не надо (т.е. надо добавлять только уникальные объекты). Применяю для проверки метод indexOf(), а он, зараза, всё время -1 выдаёт.
Кто тупит: я или он (метод indexOf)?

var mas = [];
var obj1 = {a: "a1", b: "b1"};
var obj2 = {a: "a2", b: "b2"};
mas.push(obj1);
mas.push(obj2);
alert( mas.indexOf({a: "a1", b: "b1"}) );     // всегда -1


П.С.
Я так думаю, это связано с тем, что сравниваются не сами объекты, а ссылки на них.

Последний раз редактировалось Keramet, 30.12.2015 в 12:11.
Ответить с цитированием
  #2 (permalink)  
Старый 30.12.2015, 12:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Keramet,
в строке 6 вы создали новый обьект, который никогда не будет равен другому обьекту.пишите свой фильтр.
var mas = [];
var obj1 = {a: "a1", b: "b1"};
mas.push(obj1);
var obj2 = {a: "a2", b: "b2"};
mas.push(obj2);
alert( mas.indexOf(obj1) );

Последний раз редактировалось рони, 30.12.2015 в 12:13.
Ответить с цитированием
  #3 (permalink)  
Старый 30.12.2015, 12:16
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

рони,
Спасибо. Я правильно понимаю, что indexOf для массива объектов не работает?
Наверное, надо every() или forEach() применять, а внутри них определить функцию на проверку наличия нового объекта в массиве...
Ответить с цитированием
  #4 (permalink)  
Старый 30.12.2015, 12:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Keramet,
можно проверять свойства в every что-то типа if(item.a == "a1" && item.b == "b1" ) return false
Ответить с цитированием
  #5 (permalink)  
Старый 30.12.2015, 12:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Keramet,
https://learn.javascript.ru/object-reference
Ответить с цитированием
  #6 (permalink)  
Старый 30.12.2015, 12:30
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

Спасибо, вроде разобрался.
Ответить с цитированием
  #7 (permalink)  
Старый 30.12.2015, 13:07
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Мон попробовать проверить по идентичности строкового представления добавляемых объектов
JSON.stringify(obj)

Последний раз редактировалось Deff, 30.12.2015 в 13:10.
Ответить с цитированием
  #8 (permalink)  
Старый 30.12.2015, 18:46
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Как раз сами объекты сравниваются, а они получаются по ссылке. Вы пытаетесь получить индекс объекта, которого де-факто нет в массиве
a = {}
b = {}
c = {}
alert([a, b, c].indexOf(c))

То есть, у вас там просто ахинея вместо кода. конструкция {a: 1} это сахар для new function(){this.a = 1}
Ответить с цитированием
  #9 (permalink)  
Старый 30.12.2015, 22:52
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

Сообщение от callbackhell Посмотреть сообщение
...
То есть, у вас там просто ахинея вместо кода. конструкция {a: 1} это сахар для new function(){this.a = 1}
Простите НЕсведующего: что подразумевается под ахинеей? то, что объект определил с помощью литерала? и что значит: это сахар для new function()...

По поводу Вашего кода: у меня не совсем такая ситуация. В вашем примере, вы создали 3 объекта и запихнули их в массив, потом ищите вхождение одного из них. мне надо следующее (если брать ваш код): получаю объект (в вашем случае а), если такой объект (с идентичными значениями свойств) есть в массиве, то я его не добавляю, а если нет такого - тогда добавляем. если у вас в коде добавть строку 5: d = {}; и строке 6 проверить массив с помощью .indexOf(d), то выдаст -1. Хотя такие объекты уже есть.
В принципе, я разобрался (спс Рони), просто про ахинею хотелось бы поподробнее

Последний раз редактировалось Keramet, 30.12.2015 в 23:05.
Ответить с цитированием
  #10 (permalink)  
Старый 30.12.2015, 23:15
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Keramet,
Ахинея в том, что литералом вы там создаете новый объект, вновь созданный объект не может быть равен ранее созданному, следовательно его не может быть в массиве.

ЗЫ Судя по вашим рассуждениям, сомнительно, что вы разобрались в вопросе.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ext.app.Application-cfg-namespaces - не работает для Store khusamov ExtJS 1 21.11.2015 04:20
Проблема с наполнением массива объектов - последний элемент заменяет собой все... Джангар AJAX и COMET 5 18.12.2014 22:54
скрипт multibox для joomla - не работает в опере lamanzh Opera, Safari и др. 17 26.06.2009 12:35
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
Не работает AppendChild для div, причём только в IE _Kpot_ Internet Explorer 5 12.02.2009 10:55