我正在处理一些使用许多项目的"列表"的Nodejs代码。基础实现用途包括immutable.list,immutable.Set,JavaScript数组和JavaScript Set。
由于我不会进入的原因,我希望能够不考虑基本收藏。
一些背景可能有用。对于数组,我可以使用以下循环在JavaScript数组上循环。
let anArray = [ new SomeObj(), new SomeObj(), ... ]
for(let idx=0; idx < anArray.length; idx++){
let someObj = anArray[idx];
// ... etc
if (someCondition) break;
}
对于不变的list,我需要使用immutable.list.size属性(而不是长度属性),然后使用" immutable.list.get"函数如下:
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()方法)。不变的列表基于一个不变的collection.foreach。确实支持从循环中"闯入",因此这可能会起作用,但需要将JavaScript对象包裹到不可变的序列/收集中。我是使用不变的图书馆的新手,因此可能有另一种熟悉不变的人知道的方法。
接下来描述了我正在考虑的方法。我正在考虑提供解决方案的实用程序功能:
for(let idx=0, looper=new Looper(aListOrSet); idx < looper.length(); idx++){
var item = looper.get(idx);
// ... etc
if (someCondition) break;
}
我看过的一些东西包括:
- 如何循环浏览不变的列表,例如foreach
- 不变。
- 不可变的序列 - 这可能是诀窍。我必须将JavaScript对象转换为不可变的序列,但这可能起作用。
是否有人试图解决这个问题,如果是这样,他们如何解决这个问题?
您可以使用for...of
循环。这允许您在任何可兴奋的对象上操作,其中包括内置集合以及不变的。
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++;
}
您可能还想阅读如何短路数组。它列出了包括for...of
在内的几个解决方案,这些解决方案应与您要使用的所有集合一起使用:
- 将循环包裹在
try
中,并抛出一个例外 - 使用
.some()
和return true
打破
您可以原型制作并创建自己的列表,该列表具有返回大小的长度函数。您也可以通过原型覆盖阵列上的foreach方法以突破。
我能想到的唯一的另一种方式不是超级干净,就是在调用循环循环对象并将其作为参数发送的函数之前获取对象的长度或大小。