Нажмите элемент в любом месте объекта с помощью Lodash - PullRequest
1 голос
/ 04 апреля 2019

Я использую 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 assign 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 Ответ

1 голос
/ 04 апреля 2019

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

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

...