javascript - 在迭代对象时重命名对象的键是否安全?

标签 javascript json node.js

我正在重命名一个对象的键,同时迭代它们:

Object.keys(object).forEach(function(oldKey) {
    var newKey = someFunc(oldKey);
    if (newKey !== oldKey) {
        object[newKey] = object[oldKey];
        delete object[oldKey];
    }
}

我想知道这种方法是否安全。

换句话说,我能确定我的代码永远不会迭代在上一次迭代中重命名的键吗?

最佳答案

不,你不安全。您正在根据非实时数组实时改变对象。如果您碰巧将新名称与旧名称交叉(将 a 重命名为 b,但 b 已经存在且尚未到达),您将有一段糟糕的时光。

您不会遇到您已经看到的键,但您无法知道是否尚未在对象中找到 newKey

有变通方法,这种情况类似于 .splice() 在迭代数组时(删除元素),简单的变通方法是向后迭代,这样你总是已经通过改变的 key 。 (或者在您的情况下,使用 in 运算符进行检查)

但是,创建并返回一个新对象要好得多:

const newObj = Object.keys(object).reduce(function(result, oldKey) {
    var newKey = someFunc(oldKey);
    return { ...result, [newKey]: object[oldKey] };
}, {});

当您将所有数据结构视为不可变时(更具体地说,当键永远不会改变时),您可以免费获得很多东西

关于javascript - 在迭代对象时重命名对象的键是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687418/

相关文章:

javascript - 为什么当我使用 blob 从 ArrayBuffer 加载资源时,在 chrome 上出现 `Not allowed to load local resource` 错误?

javascript - AngularJS:ng-model 不更新对象,但更新对象中的字段

java - 如何遍历 Camel 体内的嵌套列表?

node.js - 在 NodeJS 中处理长时间运行的进程?

javascript - 如何动态更改数据表上的数据顺序(包括隐藏行)

c# - 在进入另一页之前等待 DIV 停止移动

json - NodeJS + Mongo 如何查找并返回 JSON

javascript - 使用 jQuery 解析 JSON 数据

node.js - -bash 终端中找不到可执行文件命令

javascript - Node Js如何在阻塞进程的情况下处理多个并行请求