如何为搜索数组编写循环

时间:2017-10-26 08:05:21

标签: javascript jquery html arrays

我想学习如何使这段代码更清晰。我正在使用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-' };

我的目标是找到arj中的obj(表示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);
}

有更清洁的方式实现吗?

5 个答案:

答案 0 :(得分:0)

除非你被限制使用给定格式的数组,否则你可以通过将它变成一个对象或键/值对来实现你想要的......

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

然后添加或更新值...

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

答案 1 :(得分:0)

您可以使用Array#find获取对象,如果没有找到,则将obj推送到数组。

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

答案 2 :(得分:0)

您首先要搜索数组中是否存在项目,您可以使用findIndex =>如果找到了项目,只需将新object其他push替换为查找索引处的值,即可将其替换为数组。

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)
 

答案 3 :(得分:0)

我认为您应该将数据存储为map以使用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));

答案 4 :(得分: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);
&#13;
&#13;
&#13;