Как отфильтровать объект и обновить что фильтруется? JavaScript - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу отфильтровать объект и обновить то, что отфильтровано в результате.

Например:

// global object (parent)
let globalObj = {
    id: 123,
    name: "No Name",
    attributes: [{
        keyA: "Key",
        keyB: "Keys 2",
    }]
}

У меня есть вышеуказанный глобальный родительский объект, который является задачей для приема данных и сохрани это. (Как в магазине в Redux)

let updatedObj = {
    id: 123,
    name: "New Name",
    attributes: [{
        keyA: "New Key",
    }]
}

Ну, теперь я хочу, чтобы copare отфильтровывал глобальный объект с новым, фильтровал его и обновлял только то, что изменилось, остальные должны быть раскрыты ..
В результате я хочу получить что-то вроде этого:

// global object (parent after update)
let globalObj = {
    id: 123,
    name: "New Name",
    attributes: [{
        keyA: "New Key",
        keyB: "Keys 2",
    }]
}

Как я могу это сделать?

Спасибо!

1 Ответ

1 голос
/ 17 апреля 2020

Для этого проще всего использовать пакет deep merge.

Вы можете использовать deepmerge или lodash слияние

Если вы точно знаете, какие ключи вы хотите обновить, вы можете просто использовать Object.assign для каждого отдельного уровня и клавишу . Object.assign выполняет поверхностное копирование / слияние.

Для первого уровня вы можете использовать Object.assign

let mergedObject = Object.assign({}, globalObj, updatedObj) 

. Это позволит правильно объединить ключи верхнего уровня, но атрибуты будут неправильными. Так что для этого вам нужно go на один уровень вниз.

merged.attributes = globalObj.attributes.map( (item, index) => 
  Object.assign({}, item, updatedObj.attributes[i])
)

Это будет работать только , если массивы имеют одинаковый размер. Это чрезвычайно важно.

Не совсем понятно, что означает объединение двух массивов. Есть много вопросов, которые делают объединение массивов нетривиальным:

  • как добавить новый элемент
  • как определить совпадающие элементы, чтобы вы знали, какой элемент нужно обновить
  • вы принимаете это решение на основе индекса (как я) или вы используете другую стратегию

Это в значительной степени зависит от того, как вы однозначно идентифицируете элемент массива, и это в само по себе нетривиально.

...