Как проверить наличие значений после разбиения в объекте, а затем назначить их, если не существует только последнее - PullRequest
0 голосов
/ 15 февраля 2020

Есть вопрос о сортировке и добавлении объекта, точнее, например:

У меня есть строка a1/b1/c1/d1, которая spl = "a1/b1/c1/d1".split ("/") и на выходе я получаю массив из 4 элементов. У меня есть объект - obj, мне нужно циклически перемещаться по массиву spl и каждый новый ход я добавляю значения, прямо сейчас я скажу вам

for(var i = 0; i < spl.length(); i++){
    // and here's the code I don't know how to write
}

/* there must be something like this
//if obj[spl[0]] is existing then do
i = 0: obj[spl[0]] = {};

//if obj[spl[0]][spl[1]] is existing then do
i = 1: obj[spl[0]][spl[1]] = {};

//if obj[spl[0]][spl[1]][spl[2]] is existing then do
i = 2: obj[spl[0]][spl[1]][spl[2]] = {};

//and if the last element of the massiv is not existing then do
i = 3: obj[spl[0]][spl[1]][spl[2]][spl[3]] = {};

/if the last element of the massiv is existing then do nothing
the end of the cycle*/

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

obj {
    a1:{
        b1:{
            c1:{
                d1:{}
            }
        }
    }
};

Например, если у меня есть 2 элемента в spl, l oop добавит только 2 раз как в примере, если 5, то 5

Ответы [ 5 ]

1 голос
/ 15 февраля 2020

Не уверен, правильно ли я понимаю вопрос, этого вы хотите достичь?

let obj = {}
let path = 'a1/a2/a3'.split('/')

let current = obj
for (let prop of path) {
  current[prop] = current[prop] || {}
  current = current[prop]
}

console.log(obj)
0 голосов
/ 16 февраля 2020

Я нашел ответ. Вы можете изменить path и комментировать var obj = {}. Во-первых, если вы хотите создать a1 в obj, вам нужно изменить path на a1. Скрипт проверит путь и создаст его в obj. После того. Вы можете добавить /b1 к a1, чтобы создать b1 в a1 и т. Д. c.

Если вы допустили ошибку в пути (var obj = {} и var path = 'a1/b1/c1'.split("/");) программы выведет ошибку.
console.log("Wrong path_2"); - (здесь) b1 - не найдено.
console.log("Wrong path_1"); - (здесь) a1 - не найдено.

В этом скрипте у меня есть var obj = {} и path = ["a1","b1"]. obj не имеет a1, поэтому консоль выведет 'Wrong path_1' и наш obj

var path = 'a1/b1'.split("/");
var obj = {};
var addition = "";
var elem_name = "";
for(elem of path){
    if(obj[elem] === undefined && path.length === 1){

        obj[elem] = {};
        console.log(`${elem} have been created`);

    }else if(obj[elem] !== undefined && path.length > 1){

        obj = obj;
        addition = obj[elem];
        elem_name = elem;

    }else if(addition[elem] === undefined && path.length > 1 && addition !== ""){
        if(elem === path[path.length-1]){
            
            addition[elem] = {};
            console.log(`${elem} have been created in ${elem_name}`);
            break;
            
        }else if(elem !== path[path.length-1]){
            console.log("Wrong path_2");
            break;
        }

    }else if(addition[elem] !== undefined && path.length >1){

        obj = obj;
        addition = addition[elem];
        elem_name = elem;
        console.log(`${elem} was created earlier`);
        
    }else if(obj[elem] === undefined && path.length > 1){
        console.log(`Wrong path_1`);
        break;
        
    }else if(obj[elem] !== undefined && path.length === 1){
        console.log(`${elem} was created earlier`);
        break;

    }
}
console.log(obj);
0 голосов
/ 15 февраля 2020

Использование reduceRight упростит как одну строку

const obj = "a1/a2/a3/a4"
  .split("/")
  .reduceRight((acc, curr) => ({ [curr]: acc }), {});

console.log(obj);
0 голосов
/ 15 февраля 2020

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

const buildObjectFromPath = splitter => path => {
  path = path.split(splitter)
  const obj = {}
  let current = obj
  for (const prop of path) {
    current = current[prop] = {}
  }
  return obj
}

const path = 'a1/b1/c1/d1'
console.log(buildObjectFromPath('/')(path))

:)

0 голосов
/ 15 февраля 2020

let spl = "a1/b1/c1/d1".split ("/")
let obj = {}
let temp = obj
for(let i = 0; i < spl.length; i++) {
  temp[spl[i]] = {}
  temp = temp[spl[i]]
}

console.log(obj)

Для каждой итерации темп обновляется. Итак, изначально temp является obj, но на первой итерации temp["a1"] устанавливается на пустой объект, а затем значение temp обновляется до temp["a1"]. В этот момент снова temp является пустым объектом. И для следующей итерации temp["b1"] установите пустой объект и l oop продолжится.

Поскольку объекты передаются по ссылке, obj обновляется на протяжении всего процесса, что приводит к требуемому выходному формату.

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