Object.observe не всегда дает мне правильный удаленный индекс в массиве

У меня есть список с функцией наблюдателя:

var names = ['joe', 'bob', 'loic'];

Object.observe(names, function(changes){
    changes.forEach(function(change) {        
      console.log(change.type, change.name)
    });
    console.log("names",names);
});   


console.log("######## del bob");
names.splice(1,1);// output is "update 1 - delete 2", why?
console.log("names", names) // but "bob" is the one deleted in the list

Удаленный индекс в соответствии с объектом изменения равен 2, но я удалил индекс 1, и в списке фактически удален индекс 1. Ты знаешь почему?

Это потому, что индекс 1 обновляется, чтобы получить значение индекса 2, а индекс 2 удаляется? Есть ли способ получить фактический индекс удаленного элемента?


person Loic    schedule 27.11.2014    source источник
comment
Удаление элемента не означает, что все последующие элементы смещаются вниз. Если бы вы сделали delete names[1], вы бы получили одно сообщение delete, а массив содержал бы ['joe', undefined, 'loic']   -  person Barmar    schedule 27.11.2014
comment
Да, потому что как .splice работает внутри. Сначала он перезапишет (обновит) элементы массива, а затем удалит их.   -  person Felix Kling    schedule 27.11.2014
comment
Спасибо, с помощью удаления это работает! :) (JS новичок внутри)   -  person Loic    schedule 27.11.2014
comment
Может быть, вместо этого вы могли бы использовать Array.observe?   -  person Xavier Delamotte    schedule 27.11.2014
comment
Ну, delete оставляет дыру в массиве, что обычно нежелательно.   -  person Felix Kling    schedule 28.11.2014


Ответы (1)


Вы можете зафиксировать событие соединения в правильном индексе с помощью Array.observe :

var names = ['joe', 'bob', 'loic'];

Array.observe(names, function(changes){
    changes.forEach(function(change) {        
      console.log(change.type, change.name);
    });
});   

Спасибо @xavier-delamotte :)

person Loic    schedule 28.11.2014