在循环数组时修改它是否安全,例如推入一个元素?
我正在使用underscore的each方法。
在循环数组时修改它是否安全,例如推入一个元素?
我正在使用underscore的each方法。
我建议除非你绝对需要针对集合中的每个项目引发副作用(触发事件、打印结果等),否则避免使用each
。对于简单的修改集合,有更好的方法。
如果每个添加的元素仅是个别输入元素的结果,则典型的函数模式将是对数组进行flatmap
,可以将其视为两个步骤:
map
应用一个函数,为每个元素生成一个数组作为结果。整体结果将是一个数组的数组。flatten
以获得一个一维数组。使用underscore或lodash:
var origArray = [1, 2, 3, 4];
var duplicateIf3 = function (val) { return val === 3 ? [val, val] : val; };
_.flatten(origArray.map(duplicateIf3));
// -> [1, 2, 3, 3, 4]
(在类型为FP的情况下,对于不是3的值,该函数必须返回[val]
,但flatten
不关心——它将任何您提供的内容展平为一维。)
如果新元素取决于前面所有元素,您可能会使用reduce
或fold
,并将空数组作为初始值。
var origArray = [1, 2, 3, 4];
origArray.reduce(function (acc, val) { return acc.concat(acc).concat(val); }, []);
// -> [1, 1, 2, 1, 1, 2, 3, 1, 1, 2, 1, 1, 2, 3, 4]
flatten
。
reduce
比flatmap
更通用,但两种方法都能将数组转换为某种程度上取决于第一个数组的更大数组。我不确定你所说的安全是什么意思,但你必须有充分的理由去这样做。我稍微尝试了一下,以下是我得到的结果:
_.each(a, function(el) {
if (el % 2 == 0)
a.push(el + 1);
console.log(el);
});
// logs 1, 2, 3, 4, 5
console.log(a);
// logs [ 1, 2, 3, 4, 5, 3, 5 ]
_.each(a, function(el, index) {
a[index + 1] = el - 1;
if (el % 2 == 0)
a.push(el + 1);
console.log(el);
});
// logs 1, 0, -1, -2, -3
对于大多数用例,使用 _.map
更为合理。