如何获得几个immutable.js列表的联合

时间:2015-05-08 14:48:38

标签: javascript node.js list immutability immutable.js

所以,我有List a:

let a = Immutable.List([1])

和列表b:

let b = Immutable.List([2, 3])

我想从中获取列表union === List([1, 2, 3])

我试着merge他们握拳:

let union = a.merge(b); // List([2, 3])

似乎merge方法使用索引进行操作,而不是使用值进行操作,因此使用第一项List a覆盖List b的第一项。所以,我的问题是什么是获得多个列表联合的最简单方法(理想情况下不会迭代它们和其他额外的操作)。

3 个答案:

答案 0 :(得分:26)

你对合并是正确的。合并将使用合并列表的当前值更新索引。所以在你的情况下你有

$('table').on('click', '.clickable', function () {
    $(this).nextAll('tr').each( function() {
        if($(this).is('.clickable')) {
          return false;
        }
        $(this).toggle();
    });
});

并将其与

合并
[0] = 1

最终使用[0] = 2 [1] = 3 覆盖[0]=1,然后设置[0]=2,在合并后生成观察到的[1]=3数组。

解决此问题的一个非常简单的方法是使用concat

[2,3]

它适用于这种情况。但是,如果情况更复杂,这可能是不正确的。例如,

var a = Immutable.List([1]);
var b = Immutable.List([2,3]); 

var c = a.concat(b);

这会给你两个4,这在技术上不再是一个联盟。不幸的是,Immutable中没有联盟。实现它的一种简单方法是将每个列表中的每个值设置为对象的键,然后将这些键作为结果联合。

<强> jsFiddle Demo

var a = Immutable.List([1,4]);
var b = Immutable.List([2,3,4]); 

此过程为function union(left,right){ //object to use for holding keys var union = {}; //takes the first array and adds its values as keys to the union object left.forEach(function(x){ union[x] = undefined; }); //takes the second array and adds its values as keys to the union object right.forEach(function(x){ union[x] = undefined; }); //uses the keys of the union object in the constructor of List //to return the same type we started with //parseInt is used in map to ensure the value type is retained //it would be string otherwise return Immutable.List(Object.keys(union).map(function(i){ return parseInt(i,10); })); } 。使用O(2(n+m))contains的任何流程最终都会成为indexOf,这就是此处使用密钥的原因。

晚编辑

<强>超高性能

O(n^2)

答案 1 :(得分:22)

实际上Immutable.js确实有一个联合 - 它适用于Set数据结构:

https://facebook.github.io/immutable-js/docs/#/Set/union

关于Immutable.js的好处是它有助于将更多功能性编程结构引入JS - 在这个例子中是一个通用接口和抽象数据类型的能力。因此,为了在列表上调用union - 将它们转换为集合,使用union然后将它们转换回列表:

var a = Immutable.List([1, 4]);
var b = Immutable.List([2, 3, 4]); 
a.toSet().union(b.toSet()).toList(); //if you call toArray() or toJS() on this it will return [1, 4, 2, 3] which would be union and avoid the problem mentioned in Travis J's answer.

答案 2 :(得分:1)

自发布此问题以来,List#merge的实现已更改,并且在当前版本中,4.0.0-rc-12 List#merge可以正常工作并解决了问题。