Поместить элемент в любое место объекта с помощью Lodash

#javascript #lodash

#javascript #Lodash

Вопрос:

Я использую Lodash для управления объектом JSON. Я не против использования Vanilla JS, но поскольку я сейчас работаю над PoC, я просто ищу самое быстрое решение для тестирования.

Итак, вот проблема, с которой я сталкиваюсь: я хочу иметь возможность легко push добавлять элемент в массив в любом месте объекта, и он должен автоматически создавать все недостающие узлы, включая последний массив.

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

 let dl = {};

customPush(dl, 'a.b', { c: 3, d: 4 });
// or
customPush(dl, ['a', 'b'], { c: 3, d: 4 });
  

Должно создать:

 dl = {
  a: {
    b: [{
      c: 3,
      d: 4
    }]
  }
}
  

Это все, что я пробовал, но ни один из них не работает:

 function customPush(obj, path, item) {
  // This is just assigning the item to the path, not pushing to a new array
  _.set(dl, path, item);

  // This one is not doing anything visible
  _.get(dl, path, []).push(item);

  // Pushing in this one doesn't work with a path like 'a.b'
  if (_.has(dl, path)) {
    dl.path.push(item);
  } else {
    _.set(dl, path, [item]);
  }

  // Any idea?
  ...
}
  

Большое вам спасибо за вашу помощь.

Комментарии:

1. Люди запрашивали такого рода функции в Lodash здесь и здесь . Еще не добавлен, но, надеюсь, будет добавлен в какой-то момент.

Ответ №1:

Ваша попытка здесь очень близка:

 // Pushing in this one doesn't work with a path like 'a.b'
if (_.has(dl, path)) {
  dl.path.push(item);
} else {
  _.set(dl, path, [item]);
}
  

Вам просто нужно использовать, _.get если массив есть, и _.set если его нет. Вы уже выполняете последнюю часть.

 function customPush(obj, path, item) {
  if (_.has(obj, path)) {
    let arr = _.get(obj, path);
    arr.push(item)
  } else {
    _.set(obj, path, [item]);
  }
}

let objOne = { }
let objTwo = { a: [] }

let objThree = { 
  a: {
    b: {
      c: {
      }
    }
  }
}

let objFour = {
  a: {
    b: {
      c: {
        d: []
      }
    }
  }
}

customPush(objOne, "a", "item");
console.log("objOne", objOne);

customPush(objTwo, "a", "item");
console.log("objTwo", objTwo);

customPush(objThree, "a.b.c.d", "item");
console.log("objThree", objThree);

customPush(objFour, "a.b.c.d", "item");
console.log("objFour", objFour);  
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>  

Стоит отметить, что это работает только в том случае, если ключ не существует или его значение является массивом. Если вы укажете путь к существующему ключу со значением, отличным от массива, вы получите сообщение об ошибке. Вы можете проверить это с помощью _.isArray но я не уверен, что вы хотите делать, если ключ существует и не содержит массив.