Создавайте динамически вложенные объекты с помощью циклов - PullRequest
0 голосов
/ 10 июля 2019

Я хочу динамически создавать вложенный объект. Я могу создать это жестко закодировано. Возможно ли это сделать с помощью цикла?

result = {}
keys = ["a", "b", "c", "d"]

result[keys[0]] = {}
result[keys[0]][keys[1]] = {}
result[keys[0]][keys[1]][keys[2]] = {}
result[keys[0]][keys[1]][keys[2]][keys[3]] = "cool"

Я хочу передать целое число, например, если это «3», это должно создать объект, подобный:

result = {
  "a": {
     "b": {
        "c": "cool"
     }
   }
}

Если это 4, то:

result = {
  "a": {
     "b": {
        "c": {
           "d": "cool"
        }
     }
   }
}

Так далее ...

редактирование:

Я также проверяю объект результата, чтобы создать эту вложенную структуру. Если поля пока нет, я просто создаю объект.

Использование этой структуры для группировки данных. Есть ли шанс проверить это динамически?

if (!result[keys[0]]) 
if (!result[keys[0]][keys[1]]) 
if (!result[keys[0]][keys[1]][keys[2]]) 

Ответы [ 4 ]

5 голосов
/ 10 июля 2019

Для этого вы можете использовать reduceRight().Он просто начинается изнутри последнего элемента в списке ключей и работает, начиная с «круто»:

let keys = ["a", "b", "c", "d"]
let limit = 3

let result = keys.reduceRight((obj, key) => ({[key]: obj}), "cool")

console.log(result)

Чтобы ограничить, где объект останавливается, вы можете перебирать часть ключей.Например:

let keys = ["a", "b", "c", "d"]
let start = 0
let stop = 3 // slices are don't inlcude the last item, so this will stop at index 2

let result = keys.slice(start, stop).reduceRight((obj, key) => ({
  [key]: obj
}), "cool")

console.log(result)
0 голосов
/ 11 июля 2019

Я бы использовал редуктор вместе с некоторыми базовыми тестами, чтобы помочь мне: https://youtu.be/D6zLI8zrfVs

enter image description here

https://gist.github.com/brianswisher/2ce1ffe3ec08634f78aacd1b7baa31f9

0 голосов
/ 10 июля 2019

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

function setValue(object, path, value, limit) {
    var keys = path.slice(0, limit),
        last = keys.pop();

    keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
    return object;
}

var result = { foo: 42 },
    keys = ["a", "b", "c", "d"];

setValue(result, keys, 'cool');
console.log(result);

setValue(result, keys, 'cool', 3);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 10 июля 2019

простое решение для цикла.

let result = {}
let keys = ["a", "b", "c", "d"]
let depth=3;

let current = result
for(let i=0;i<depth;++i){
  let key = keys[i]
  if(i == depth-1) current[key] = 'cool'
  else current = current[key] = {}

}

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...