2017-11-10 8 views
4

基本的に、私はオブジェクトの配列を持っており、配列内の条件を満たすオブジェクトのみを更新したいと思います。私はその問題を解決する良い機能的な方法があるかどうかを知りたい。今はロダッシュを使っています。ここだと例:条件付き_mapを実行するためのlodash関数か '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

これは少し早いかもしれないですが、ステージ3に現在あるproposal for object rest spreadであなたはこのようにそれを解決することができます:

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);

関連する問題