2016-07-25 2 views
2

Почему карта изменяет старый массив numbers? Я не хочу менять старый массив, я хочу его отредактировать (key * 2) и поместить его в новый массив roots. Может кто-нибудь объяснить, в чем проблема?Метод карты изменить старый массив

var numbers = [{key:1,prop:"ok"}, {key:2,prop:"ok"}, {key:3,prop:"ok"}]; 
 
var roots = numbers.map(index => { 
 
    index.key = index.key * 2 
 
    return index 
 
}) 
 

 
console.log('numbers', numbers) 
 
console.log('roots', roots)

+0

Только для вас: Ваш «массив» является объектом JSON, а не хороший обычный массив. :-) И какой фреймворк Javascript вы использовали? – reporter

+0

@reporter Я думаю, вы написали это назад. Здесь нет json – 4castle

+0

okey thx, любая идея достичь этого? – Doom

ответ

1

Похоже нет прямого способа скопировать массив без ссылок. Но это работает Тхо:

var numbers = [{key:1,prop:"ok"}, {key:2,prop:"ok"}, {key:3,prop:"ok"}]; 
 
var roots = JSON.parse(JSON.stringify(numbers)); 
 
roots.map(index => { 
 
    index.key = index.key * 2 
 
    return index 
 
}) 
 

 
console.log('numbers', numbers) 
 
console.log('roots', roots)

+0

Это работает Да, может объяснить, почему, я не понял, почему мне нужно разобрать его номера смысла, это не строка – Doom

+0

Это потому, что 'roots' и' numbers' указывают на тот же объект. –

+0

Если вы не собираетесь записывать результат «карты», вы также можете использовать 'forEach', чтобы не создавать третий неиспользуемый массив. – 4castle

2

В вашем случае, самый простой подход был бы

var numbers = [{key:1,prop:"ok"}, {key:2,prop:"ok"}, {key:3,prop:"ok"}]; 
var roots = numbers.map(elt => ({ 
    key: elt.key * 2, 
    prop: elt.prop 
})); 

Другими словами, вернуть новым объектам из map.

Или, если вы предпочитаете, вы можете destructure параметр:

var roots = numbers.map(({key, prop}) => ({key: key * 2, prop})); 
+0

Это должен быть принятый ответ –

+0

Я бы также переименовал' index' в 'object' – 4castle