在循环时修改数组是否安全
Is it safe to modify an array while looping it?
在
循环时修改数组是否安全,例如推送元素?
我使用下划线每种方法
我建议避免each
,除非你绝对需要对集合中的每个项目造成副作用(触发事件,打印结果等)。对于简单地修改您的收藏,有更好的方法。
如果每个添加的元素只是单个输入元素的结果,则典型的功能模式是flatmap
数组,可以认为分为两个步骤:
- 使用
map
应用一个函数,该函数为每个元素生成一个数组作为结果。总体结果将是一个数组数组。 - 在该数组数组上使用
flatten
来获取一维数组。
使用下划线或短划线:
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]
(抱歉,我想不出一个实际的例子,但为了说明目的,这里每一步都以非常简单的方式使用之前所有步骤的完整输出,您可以从原始数组的每个值中看到发生了什么。另请注意,如果您不想使用下划线/lodash,您可以从reduce
制作自己的flatten
)
reduce
比flatmap
更通用,但这两种方法都能够将数组转换为更大的数组,而该数组在某种程度上取决于第一个数组。
如果你有兴趣了解更多,我强烈建议你看看Reg Braithwaite的免费(在线)Javascript Allongé。
我不确定你所说的安全是什么意思,但你必须有一个很好的理由来这样做。我玩了一下,这是我得到的:
_.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
会更有意义。
相关文章:
- 当eval只执行服务器端数据时,在javascript中使用eval是否安全
- 假设浏览器渲染为60 fps是否安全
- 如果条件将长 JavaScript 拆分为多行是否安全
- 如何检测在 Javascript 中使用“in”运算符是否安全
- 为用户应用程序托管 javascript 文件是否安全
- 使用AngularJS是否安全
- 在JavaScript源代码中使用UTF-8字符文字是否安全
- 每隔1秒调用一次jQueryajax是否安全
- 使用Ajax提交表单是否安全
- 重新触发Javascript事件是否安全
- 使用for.of迭代时删除集合中的元素是否安全
- jQuery(userInput)对最终用户来说是否“安全”
- JavaScript 在表单中注入密码是否安全
- 如果没有其他用户会看到未转义的用户输入,渲染它是否安全
- 是否安全应用是最佳实践
- 使用 Restangular 使用 RESTful API - RESTful API 将数组作为顶级对象返回是否安全
- 网络套接字是否安全
- 在循环时修改数组是否安全
- HTML 文本框值属性是否安全免受 XSS 攻击
- 在 JavaScript 中依赖全局本机对象是否安全,尤其是 Object 对象