我可以使用相同的代码循环使用immutable.List,immutable.Set或Javascript Array或Set吗?

时间:2017-12-15 01:19:30

标签: javascript immutable.js

我正在使用一些使用许多不同"列表的NodeJS代码"的项目。底层实现使用包括Immutable.List,Immutable.Set,Javascript Array和Javascript Set。

由于我不会进入的原因,我希望能够在不考虑基础集合的情况下循环这些项目。

某些背景可能有用。对于Array,我可以使用以下内容遍历Javascript数组。

let anArray = [ new SomeObj(), new SomeObj(), ... ]
for(let idx=0; idx < anArray.length; idx++){
    let someObj = anArray[idx];
    // ... etc
    if (someCondition) break;
}

对于Immutable.List,我需要使用Immutable.List.size属性(而不是length属性)并使用&#34; Immutable.List.get&#34;功能如下:

const immutable = require('immutable');

let aList = immutable.List([ new SomeObj(), new SomeObj(), ... ]);
for(idx=0; idx < aList.size; idx++){
    var item = aList.get(idx);
    // ... etc
    if (someCondition) break;
}

除了一些小差异之外,循环逻辑非常接近。

对于那些建议使用每个对象上可用的forEach()方法的自然答案的人。正常的Javascript Array.forEach()方法不会处理循环(这种情况需要Array.some()方法)。 Immutable.List基于Immutable.Collection.forEach,支持&#34;打破&#34;离开循环所以这可能会工作,但需要将Javascript对象包装成一个不可变的序列/集合。我是使用不可变库的新手,因此可能会有另一种方法为熟悉Immutable的人所熟知。

接下来将介绍我正在考虑的方法。 我正在考虑提供如下解决方案的效用函数:

for(let idx=0, looper=new Looper(aListOrSet); idx < looper.length(); idx++){
    var item = looper.get(idx);
    // ... etc
    if (someCondition) break;
}

我看过的一些内容包括:

有没有其他人试图解决这个问题,如果是这样,他们是如何解决这个问题的?

2 个答案:

答案 0 :(得分:1)

您可以使用for...of循环。这允许您操作任何Iterable对象,其中包括内置集合以及Immutable.js集合。

for (let element of collection) {
    // do something with element
    if (someCondition) {
        break;
    }
}

它不会像普通for循环或forEach那样让您访问迭代索引,但这很容易跟踪自己:

let i = 0;
for (let element of collection) {
    // do something with element
    if (someCondition) {
        break;
    }
    i++;
}

您可能还想阅读How to short circuit Array.forEach like calling break。它列出了一些解决方案,包括for...of,它们可以与您想要使用的所有集合一起使用:

  • 将循环包裹在try中并抛出异常以打破
  • 使用.some()return true打破

答案 1 :(得分:0)

您可以创建原型并创建自己的列表,该列表具有返回大小的长度函数。您还可以通过原型覆盖数组上的forEach方法以进行分解。

我能想到的唯一另一种不是超级干净的方法是在调用循环对象的函数并将其作为参数发送之前获取对象的长度或大小。