Изменить сложный глубоко вложенный объект JavaScript - PullRequest
1 голос
/ 15 мая 2019

Предположим, у вас есть сложный глубоко вложенный объект с 15 - 20 уровнями, и вы хотите запросить определенный узел внутри него на основе поля и изменить определенный атрибут. Как мы можем этого достичь?

Следующий пример придуман, и объект не такой сложный, как мой, и не такой глубокий, поэтому, пожалуйста, не предлагайте что-то вроде obj[phoneNumbers][0].number = somethingNew

Я использую библиотеку под названием jsonpath в следующем примере, чтобы запросить определенный узел и получить его значение с помощью выражения jsonpath.

var jp = require("jsonpath");

const obj = {
  firstName: "John",
  lastName: "doe",
  age: 26,
  address: {
    streetAddress: "naist street",
    city: "Nara",
    postalCode: "630-0192"
  },
  phoneNumbers: [
    {
      type: "iPhone",
      number: "0123-4567-8888"
    },
    {
      type: "home",
      number: "0123-4567-8910"
    }
  ]
};

const number = jp.query(obj, "$.phoneNumbers[0].number");
console.log(number);

// outputs: [ '0123-4567-8888' ]

Спасибо.

1 Ответ

2 голосов
/ 15 мая 2019

Если вы в порядке с использованием lodash (npm i --save lodash) (https://lodash.com/), тогда довольно легко получить или установить глубоко вложенное значение.

Получить глубоко вложенное значение: (https://lodash.com/docs#get)

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

_.get(object, ['a', '0', 'b', 'c']);
// => 3

_.get(object, 'a.b.c', 'default');
// => 'default'

Установить глубоко вложенное значение: (https://lodash.com/docs#set)

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4

_.set(object, ['x', '0', 'y', 'z'], 5);
console.log(object.x[0].y.z);
// => 5
...