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

标签 javascript immutable.js

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

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

算法连接应该这样做:

  • 如果某个 ID 在 list1 和 list2 中都存在,则从 list2 中获取值。
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 循环完成后,检查映射是否存在元素,然后将映射中的所有值插入输出数组并返回;

index.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/

关于javascript - Immutable.js 算法 : List. update_or_add(item),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239305/

相关文章:

php - 如何维护各国时间戳

Javascript 搜索多个参数

javascript - 如何在mvc3中加载页面时调用javascript函数

javascript - 从 immutable.js 中的动态映射对象获取值/键

javascript - 将包含属性的 Backbone 集合序列化为 JSON

javascript - 指定 dygraphs x 间隔刻度

javascript - 如何从 .map() JS 创建不可变 map

javascript - 如何在 ImmutableJS Record 的扩展类上使用 setter

javascript - 使用 Immutable.js 的动态键

angular - 在 Angular 2 + Immutable.js 中迭代(使用 *ngFor)