2017-11-10 22 views
4

기본적으로 개체 배열이 있고 조건을 만족하는 배열의 개체 만 업데이트하고 싶습니다. 나는 그 문제를 해결하는 좋은 기능적 방법이 있는지 알고 싶다. 지금 나는 lodash를 사용하고 있습니다. 여기 예 :Lodash 함수 또는 조건부 _.map을 수행하는 'lodash way'가 있습니까?

var things = [ 
    {id: 1, type: "a", value: "100"}, 
    {id: 2, type: "b", value: "300"}, 
    {id: 3, type: "a", value: "100"} 
]; 
var results = _.map(things, function (thing) { 
    if(thing.type === "a") { 
     thing.value = "500"; 
    } 
    return thing; 
}); 
// => results should be [{id: 1, type: "a", value: "500"}, {id: 2, type: "b", value: "300"}, {id: 3, type: "a", value: "500"}]; 

답변

1

당신은 유형 인 경우 새 업데이트 된 객체를 생성하는 삼항와 Array#map (또는 Lodash의 상당)를 사용할 수 있습니다 aObject#assign를 사용하여 :

var things = [ 
 
    {id: 1, type: "a", value: "100"}, 
 
    {id: 2, type: "b", value: "300"}, 
 
    {id: 3, type: "a", value: "100"} 
 
]; 
 
var result = things.map(function (thing) { 
 
    return thing.type === 'a' ? Object.assign({}, thing, { value: 500 }) : thing; 
 
}); 
 

 
console.log(result);

4

map 방법을 사용할 필요는 없습니다.

콜백 함수를 전달하여 간단히 forEach 함수를 사용할 수 있습니다.

var results = _.forEach(things, function (thing) { 
    if(thing.type === "a") { 
    thing.value = "500"; 
    } 
}); 
2

당신은 원래 개체를 돌연변이없이, Object.assign의 내부 상태와 새로운 객체를 매핑 할 수 있습니다.

var things = [{ id: 1, type: "a", value: "100" }, { id: 2, type: "b", value: "300" }, { id: 3, type: "a", value: "100" }], 
 
    results = things.map(o => Object.assign({}, o, o.type === "a" && { value: 500 })); 
 

 
console.log(results);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

이 일찍 아마 조금이지만, 현재 사용중인 proposal for object rest spread 무대-3는 다음과 같이 그것을 해결할 수 :

const things = [ 
 
    {id: 1, type: "a", value: "100"}, 
 
    {id: 2, type: "b", value: "300"}, 
 
    {id: 3, type: "a", value: "100"}, 
 
]; 
 
const result = things.map(e => e.type === 'a' ? {...e, value: 500 } : e); 
 
console.log(result);