2017-10-26 6 views
1

私はこのコードをもっときれいにする方法を学びたいと思っています。私はJavaScriptを使用しています。ここで検索配列のループを書く方法

は、オブジェクトの配列です:

var arr = [ 
    { key: 'qqqqq', value: '11' }, 
    { key: 'aaaaa', value: '121' }, 
    { key: 'bbbbb', value: '131' }, 
    { key: 'ccccc', value: '141' }, 
] 

var obj = { key: 'cccc', value: '-fd-' }; 

私の目標は、OBJ場合ARRで見つけることですそれがない場合には(それが意味し、arritem.key == obj.key)、そうでない場合は、値を更新しますobjをarrに追加します。

直接の考え方は次のとおりです。

let has = false; 
for(const item of arr) { 
    if(item.key == obj.key) { 
     item.value = obj.value; 
     has = true; 
     break; 
    } 
} 

if(!has) { 
    arr.push(l); 
} 

それは達成するためのクリーンな方法がありますか?

+0

は固有のキーですか? –

答えて

0
var data = { 
    'qqqqq': '11', 
    'aaaaa': '121', 
    'bbbbb': '131', 
    'ccccc': '141' 
} 

が、その後追加する

あなたは、配列のために、与えられたフォーマットを使用するように制限している場合を除き、あなたがオブジェクトや、キー/値のペアにそれを回すことにより、あなたが望むものを達成することができます...または更新配列へのプッシュobj見つからない場合は、値...

data['ccccc'] = '-fd-'; // updates ccccc 
data['eeeee'] = 'new'; // adds eeeee 
0

あなたがオブジェクトを取得するためArray#findを使用したりできます。アイテムは、あなたの配列に存在する場合

var arr = [{ key: 'qqqqq', value: '11' }, { key: 'aaaaa', value: '121' }, { key: 'bbbbb', value: '131' }, { key: 'ccccc', value: '141' }], 
 
    obj = { key: 'cccc', value: '-fd-' }; 
 
    temp = arr.find(o => o.key === obj.key); 
 

 
if (temp) { 
 
    temp.value = obj.value; 
 
} else { 
 
    arr.push(obj); 
 
} 
 

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

+1

'o.key === obj.key'を読まないといけませんか? @JamieMcElwain、 –

+0

、右。タイプミス。 –

0

あなたはアイテムが発見された場合は、ちょうどあなたの新しいobjectpushによってfindedたインデックスに値を置き換えるfindIndex =>を使用することができ、最初の検索にしましたそれをあなたの配列に入れます。

var arr = [ 
 
    { key: 'qqqqq', value: '11' }, 
 
    { key: 'aaaaa', value: '121' }, 
 
    { key: 'bbbbb', value: '131' }, 
 
    { key: 'ccccc', value: '141' }, 
 
] 
 

 
var obj = { key: 'cccc', value: '-fd-' }; 
 
var obj2 = { key: 'aaaaa', value: 'newValue' }; 
 

 
function updateOrPush(arr,obj){ 
 
    var id = arr.findIndex(e => e.key == obj.key); 
 
    if(id > -1){ 
 
    arr[id] = obj; 
 
    } 
 
    else{ 
 
    arr.push(obj); 
 
    } 
 
} 
 

 
updateOrPush(arr,obj); 
 
updateOrPush(arr,obj2); 
 
console.log(arr) 
 

0

は、私はあなたがこのコードは単純になりますO(1)

var arr = [ 
 
    { key: 'qqqqq', value: '11' }, 
 
    { key: 'aaaaa', value: '121' }, 
 
    { key: 'bbbbb', value: '131' }, 
 
    { key: 'ccccc', value: '141' }, 
 
] 
 

 
arrAsMap = arr.reduce((acc, el) => { 
 
    acc[el.key] = el; 
 
    return acc; 
 
}, {}); 
 

 
var obj1 = { key: 'cccc', value: '-fd-' }; 
 
var obj2 = { key: 'cccc1', value: 'test' }; 
 

 
function updateOrPush(obj) { 
 
    if (arrAsMap[obj.key]) { 
 
    arrAsMap[obj.key] = obj.value; 
 
    } else { 
 
    arrAsMap[obj.key] = obj; 
 
    } 
 
} 
 
updateOrPush(obj1); 
 
updateOrPush(obj2); 
 
console.log(Object.values(arrAsMap));

0

希望で値を取得するにはマップとしてデータを格納すべきだと思う

var arr = [ 
 
    { key: 'qqqqq', value: '11' }, 
 
    { key: 'aaaaa', value: '121' }, 
 
    { key: 'bbbbb', value: '131' }, 
 
    { key: 'ccccc', value: '141' }, 
 
] 
 

 
var obj = { key: 'cccc', value: '-fd-' }; 
 

 
var objIndex = arr.findIndex(ele => ele.key === obj.key); 
 

 
objIndex < 0 ? arr.push(obj) : arr[objIndex].value = obj.value; 
 
    
 
console.log(arr);

関連する問題