Здесь вы неоднозначно используете массив в качестве объекта:
toggleSelection(contact) {
contact.isSelected = !contact.isSelected;
selectedContacts = [];
this.state.contacts.map(function(contact){
if (contact.isSelected){
selectedContacts[contact.id] = contact.facebook_url;
}
});
this.setState({selectedContacts});
}
Чтобы добавить элемент в массив javascript, вы должны использовать метод Array.prototype.push, иначе длина не изменится(не совсем верно, подробности ниже).
Дело в том, что JS typeof [] === 'object
, поэтому вы можете написать arr [newKeyThatMayNotBeANumber], чтобы добавить свойство newKeyThatMayNotBeANumber
к объекту arr, но тем самым вы выигралиНе всегда увеличивайте длину массива.
Поскольку JS слишком любезен, он на самом деле изменит размер массива, если newKeyThatMayNotBeANumber
интерпретируется как число (то есть: является числом или представлением строки base10числа).
Но в противном случае это не удастся. Поэтому полезно использовать реальный объект ({}
) для адресации клавиш и методы мутации массива (или строгого доступа к индексам чисел) для массивов.
Консольный вывод в Chrome, демонстрирующий этот видпроблема:
const arr = [];
console.log(arr.length)
=> 0
arr['128'] = 'a';
console.log(arr)
=> [empty × 128, "a"]
console.log(arr.length)
=> 129
arr['bar'] = 'a';
console.log(arr)
=> (129) [empty × 128, "a", bar: "a"]
console.log(arr.length)
=> 129
Тем не менее, contact.id всегда число?