我想学习如何使这段代码更清晰。我正在使用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);
}
有更清洁的方式实现吗?
答案 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;