繁体   English   中英

Immutable.js 算法:List.update_or_add(item)

[英]Immutable.js algorithm: List.update_or_add(item)

我想在 immutable.js 中连接 2 个列表。

两个列表都具有以下结构:{ id, value }

算法连接应该这样做:

  • 如果列表 1 和列表 2 中都存在 ID,则从列表 2 中获取值。
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM