嵌套对象:使用相同的名称更新所有属性

时间:2018-12-20 11:18:25

标签: javascript arrays typescript object

我有一个带有多个嵌套对象的退出复杂对象。 我想复制并更新所有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。

2 个答案:

答案 0 :(得分:2)

您可以遍历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);

答案 1 :(得分:1)

这是一个将原始对象克隆到新对象的函数,其中每个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);