2017-06-16 3 views
0

既存のオブジェクトを検索し、そのプロパティを変更したいと考えています。 これは素晴らしい作品:どのようにforループでより宣言的なオブジェクトのキーを変更するには?

function changeObjectKey(targetObject) { 
     for(var i = 0; i < listofobjects.length; i++) { 
      if(targetobject.keyone == listofobjects[i].keyone) 
      listofobjects[i].keytwo = 'changedvalue'; 
      break; 
      } 
     } 
} 

私はどのように私はそれを行うことができ、フィルタを使って賢くそれを作りたいですか?私が試した:

function changeObjectKey(targetObject) { 
let filteredobject = listofobjects.filter(function(currentobject) { 
return (currentobject.keyone == targetobject.keyone); 
}); 
filteredobject.keytwo = 'changedvalue'; 

}

注:つだけの目的は、フィルタに一致します。 後者はlistofobjects.keytwoを変更していません...しかし、私はそれのコピーを考えています。最初のケースでは、元のlistofobjects [i] .keytwoが変更されています。

これを行う正しい方法は何ですか?

答えて

0

map()メソッドが優れていると思います。

map()メソッドは、この配列のすべての要素に提供された関数を呼び出した結果で新しい配列を作成します。

listofobjects = listofobjects.map(function(currentobject) { 
     if(currentobject.keyone === targetobject.keyone){ 
      currentobject.keytwo = "changed value"; 
     } 
    }); 

結果は同じ配列であるが、今tarjetobjecのkeytwoは、その値を変更しています。

0

ただ、最初[0]を取る:

let filteredobject = listofobjects.filter(function(currentobject) { 
return (currentobject.keyone == targetobject.keyone); 
})[0]; 
filteredobject.keytwo = 'changedvalue'; 
0

私はmapは、このためのより良いフィットだろうと思います。もちろん、filterの後にmapをチェーンすることもできます。

また、元のオブジェクトに変更を加えていません。それがあなたがしたいことなら、それをすることができます。しかし、一般的に、これらの機能(mapfilterreduce)を使用してデータを変更することはありません。

function changeObjectKey(targetObject) { 
    return listofobjects.map(function (obj) { 
    if (obj.keyone !== targetobject.keyone) { 
     return obj; 
    } 

    return Object.assign({}, obj, { 
     keytwo = 'changedvalue' 
    }) 
    }) 
} 
関連する問題