【问题标题】:Nested object: Update all attributes with same names嵌套对象:更新具有相同名称的所有属性
【发布时间】:2018-12-20 11:18:24
【问题描述】:

我有一个带有多个嵌套对象的复杂对象。 这个对象我想复制和更新所有 id 属性。

所以这个:

{
  id: 1,
  name: "A",
  car: {
    id: 2,
    vendor: "xy"
    }
  ..
}

应该变成这样:

{
  id: 6,
  name: "A",
  car: {
    id: 7,
    vendor: "xy"
    }
  ..
}

有没有办法用 JavaScript (TypeScript) 以一种简短而通用的方式来解决这个问题?

更新: 到目前为止我做了什么:

const a = new MyClass();
a.id = uuid();
a.name = "A"
a.car = new Car();
a.car.id = uuid();
a.car.vendor = "xy"

//copy a
const b = JSON.parse(JSON.stringify(a));

我想要做的就是将 b 中的所有 id 增加 5。

【问题讨论】:

  • 发布的问题似乎根本没有包含any attempt 来解决问题。 StackOverflow 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您遇到minimal reproducible example 的特定障碍。欲了解更多信息,请参阅How to Ask 并拨打tour
  • 您对id 应用的逻辑是什么?你想全部加 5 个吗?
  • 你的"copy"是什么意思?
  • 实际上 id 是 uuid,我想为每个 id 生成一个新的 uuid(使用 uuid())
  • 我对文案的含义做了一些澄清。

标签: javascript arrays typescript object


【解决方案1】:

您可以遍历b 中的所有项目并做两件事。如果它是 id 属性,请更改它(添加 5)。如果它是一个对象,则循环并检查两个相同的条件(递归函数)。你可以这样做:

function checkObject(obj) {
    Object.keys(obj).forEach(function(prop) { 
        if (typeof obj[prop] == "object" && prop !== null) { 
            checkObject(obj[prop]);
        }
        else if (prop == "id") {
            obj[prop] += 5;
        }
    })
}

那么你可以这样称呼它:

function checkObject(obj) {
    Object.keys(obj).forEach(function(prop) { 
        if (typeof obj[prop] == "object" && prop !== null) { 
            checkObject(obj[prop]);
        }
        else if (prop == "id") {
            obj[prop] += 5;
        }
    })
}

var b = {
  id: 1,
  name: "A",
  car: {
id: 2,
vendor: "xy"
}
 }

checkObject(b);
console.log(b);

【讨论】:

  • 请注意typeof null === "object"
  • 好吧,山姆,我想我已经修好了。 trincot,我也知道如何解决这个问题。
  • 现在修复了山姆
  • 真的很抱歉 - 我之前为自己编写了这段代码,但出现了一些复制粘贴错误。
  • @JackBashford - 是的,这现在可以按我的预期工作,感谢您忍受我的许多错误检查,+1 为这个解决方案,因为它优雅且运行良好!
【解决方案2】:

这是一个将原始对象克隆为新对象的函数,其中每个 id 属性接收由给定 uuid 函数生成的新值:

function assignId(data, uuid) {
    return Object(data) !== data ? data
        : Object.assign({}, ...Object.entries(data).map( ([k, v]) =>
            ({ [k]: k === "id" ? uuid() : assignId(v, uuid) })
        ));
}

// Example use:
function uuid() {
    return uuid.next = (uuid.next || 1000) + 1;
}
const a = { id: 1, name: "A", car: { id: 2, vendor: "xy" } };
const b = assignId(a, uuid);
console.log(b);

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2021-11-24
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多