嵌套对象:更新所有具有相同名称的属性
2018-12-20
793
我有一个包含多个嵌套对象的非常复杂的对象。 我想复制并更新此对象的所有 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个回答
您可以循环遍历
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);
Jack Bashford
2018-12-20
这是一个将原始对象克隆到新对象的函数,其中每个
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);
trincot
2018-12-20