Вложенный объект: обновить все атрибуты с одинаковыми именами - PullRequest
0 голосов
/ 20 декабря 2018

У меня сложный сложный объект с несколькими вложенными объектами.Этот объект я хочу скопировать и обновить все атрибуты идентификатора.

Так вот:

{
  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));

Все, что я хочу сделать, это увеличить все идентификаторы вб на 5.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вот функция, которая клонирует исходный объект в новый, где каждое свойство 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);
0 голосов
/ 20 декабря 2018

Вы можете просмотреть все элементы в 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);
...