#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
но я не уверен, что вы хотите делать, если ключ существует и не содержит массив.