[英]Immutable.js algorithm: List.update_or_add(item)
我想在 immutable.js 中连接 2 个列表。
两个列表都具有以下结构:{ id, value }
算法连接应该这样做:
let list1 = [
{ id: 1, value: 'foo' },
{ id: 3, value: 'bar' },
{ id: 2, value: 'baz' },
]
let list2 = [
{ id: 1, value: 'quux' }, // id 1 exists in list1
{ id: 4, value: 'asd' },
]
let result = [
{ id: 1, value: 'quux' }, // from list 2
{ id: 3, value: 'bar' },
{ id: 2, value: 'baz' },
{ id: 4, value: 'asd' },
]
如果 Immutable.js 具有另一种类型(例如字典)的此功能,我也可以使用它。
联合算法
首先,您必须维护两个映射,键为id
,值为object
然后检查大小较大的数组的长度,并将较大大小的数组与小大小的映射传递给merged
函数,在那里您可以迭代数组并检查它是否是存在于地图中,如果是,则更新对象并从地图中删除该行,否则将对象添加到输出中。 在 for 循环完成后检查 map 是否存在元素,然后将 map 中的所有值推入输出数组并返回;
索引.js
const old = [
{ id: 1, value: 'foo' },
{ id: 3, value: 'bar' },
{ id: 2, value: 'baz' },
];
const newa = [
{ id: 1, value: 'quux' }, // update
{ id: 4, value: 'asd' }, // push
];
function merged(input,filterMap){
var output = [];
input.forEach(function(eachRow){
if(filterMap.hasOwnProperty(eachRow.id)){
output.push(Object.assign(eachRow,filterMap[eachRow.id]));
delete filterMap[eachRow.id];
}else{
output.push(eachRow);
}
});
if(Object.keys(filterMap).length > 0){
output = output.concat(Object.values(filterMap));
}
return output;
}
function parseData(first,second){
var mapFirst = {},
mapSecond = {};
var output = [];
first.forEach(function(eachRow){
mapFirst[eachRow.id] = eachRow;
});
second.forEach(function(eachRow){
mapSecond[eachRow.id] = eachRow;
});
if(first.length > second.length){
return merged(first,mapSecond);
}else{
return merged(second,mapFirst);
}
}
console.log(parseData(old,newa));
工作 jsFiddle 演示 - https://jsfiddle.net/qz25hnmf/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.