开发者问题收集

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

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