2017-02-22 9 views
2

У меня есть следующие функции:Добавление недвижимости с использованием объекта назначения

addHrefs = (list) => { 
    const listWithHrefs = list.map((item) => { 
     item.href = customFunction(item.name); 
     return item; 
    }); 
    return listWithHrefs; 
} 

Проблема здесь я мутирует в list объект. Я хочу знать, как добавить определенную пару (key, value) без мутации list. Возможно ли это с Object.assign? Как мне это сделать?

ответ

3

Возможно с Object.assign.

Метод Object.assign() используется для копирования значения всех перечислимых собственных свойств из одного или нескольких объектов источника к целевому объекту. Он вернет целевой объект.

Вы можете присвоить значение свойства новому объекту и вернуть его.

addHrefs = list => 
    list.map(item => Objects.assign({}, item, { href: customFunction(item.name) })); 
+0

Обратите внимание, что это не может мутировать 'list', но до сих пор использует мутацию. – Bergi

+0

@Nina Scholz Это сработало. Но я не могу понять, почему «list» был мутирован (поэтому я предположил, что мне нужно работать с «Object.assign»). Я попробовал в javascript-консоли функцию «map», и она не мутировала мой объект списка «b = a.map (function (i) {return i * 2})», а затем 'JSON.stringify (a) === JSON.stringify (b) 'был ложным, поэтому, я думаю, это поведение ES6, если это так, вы можете объяснить мне, почему« list »был мутирован? – FacundoGFlores

+1

он мутирует 'list', потому что' item' получает мутацию, потому что 'item' является ссылкой на объект. ваш пример не изменяет никакого объекта. –

1

Вы можете передать простой объект в качестве первого параметра в Object.assign(), ссылающийся объект по второму параметру. Выполните действия по переменному присвоенному Object.assign(), возвращать переменную

let list = [{ 
 
    a: 1 
 
}, { 
 
    a: 2 
 
}, { 
 
    a: 3 
 
}]; 
 

 
let res = list.map(item => { 
 
    let o = Object.assign({}, item); 
 
    // do stuff with `o` 
 
    o.a = o.a + 10; 
 
    // return `o` 
 
    return o 
 
}); 
 

 
console.log(list, res);