Установить вложенный элемент в объекте / массиве из массива ключей - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть набор JSON с несколькими объектами, массивами, строками, логическими значениями, числами и т. Д., Которые хранятся в одном объекте на корневом уровне и в компоненте.

Вот пример:

{
  "theme": {
    "auto": {
      "sensor": "sensor.sn1_ldr",
      "below": 600
    },
    "ui": {
      "cards": {
        "round": false,
        "elevation": 1
      }
    },
    ...
  },
  ...
}

Мне удалось передать путь и новое значение элемента в массиве, например, так:

["theme", "auto", "sensor"]

Как мне установить новое значение этого пути?то есть.эквивалент:

config.theme.auto.sensor = newValue;

, но с использованием возвращенного массива пути?

Метод, который у меня пока есть:

handleConfigChange = (path, value) => {
  console.log(path, value);
  let config = this.state.config;
  // Set the new value

  this.setState({ config });
};

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018
  1. Используйте Object.key для получения ключа Array:

[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys][1]

Используйте рекурсию для циклического прохождения.

const object1 = {
  "theme": {
    "auto": {
      "sensor": "sensor.sn1_ldr",
      "below": 600
    },
    "ui": {
      "cards": {
        "round": false,
        "elevation": 1
      }
    },

  },  
}

var result = [];
see(object1);
console.log(result);

function see (obj){
    var k = Object.keys(obj)
    for (var i = 0; i < k.length; i++){
        result.push(k[i]);
        if (obj[k[i]] instanceof Object){
            see(obj[k[i]]);
        }
    }
}

[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

0 голосов
/ 22 сентября 2018

Ниже приведен простой вариант ответа Нины (тот, который использует сокращение).

Надеюсь, это поможет вам понять, что происходит за этим.

const setValueByPathArray = (object, path, value) => {
  let i = 0
  let reference = object
  while (i < path.length - 1) {
    const currentPath = path[i]
    reference = reference[currentPath]
    i += 1
  }
  const lastPath = path[path.length - 1]
  reference[lastPath] = value
  return object
}

const config = { theme: { auto: { sensor: "sensor.sn1_ldr", below: 600 }, ui: { cards: { round: false, elevation: 1 } } } }
const path = ["theme", "auto", "sensor"];

setValueByPathArray(config, path, 'foo')
0 голосов
/ 22 сентября 2018

Вы можете сохранить последний ключ и уменьшить объект, взяв ключи из пути.

function setValue(object, path, value) {
    var last = path.pop();
    path.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
}

var config = { theme: { auto: { sensor: "sensor.sn1_ldr", below: 600 }, ui: { cards: { round: false, elevation: 1 } } } },
    path = ["theme", "auto", "sensor"];

setValue(config, path, 'foo');

console.log(config);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...