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