Как опустить конкретный ключ при передаче объектов JSON в массив? - PullRequest
0 голосов
/ 17 декабря 2018

Итак, у меня есть массив объектов JSON, который, в свою очередь, содержит другие массивы объектов.Этот массив объектов не имеет определенной фиксированной структуры как таковой, поэтому мне очень трудно сделать что-то вроде delete mainArray[0].obj.subobj[1].objToOmit;

Так что у меня есть ключ / объект с именем possibleAnswers, который мне нужно удалить / опустить.В моей программе я помещаю содержимое одного массива в другой.Поэтому, когда я помещаю содержимое первого массива объектов в другой, мне нужно не пускать объект possibleAnswers.

Есть ли способ или функция, которая ищет массив объектов и помогает мне пропуститьнеобходимый ключ?Или каково было бы решение в соответствии с вашими мыслями?

Пример:

Вот минимальный пример: https://codebeautify.org/jsonviewer/cb9fea0d Редактировать: В приведенном выше JSON есть ключ под названием possibleMembers что не так.его possibleAnswers

            var collectObservationsFromConceptSets = function () {
            $scope.consultation.observations = [];
            _.each($scope.consultation.selectedObsTemplates, function (conceptSetSection) {
                if (conceptSetSection.observations) {
                    _.each(conceptSetSection.observations, function (obs) {
                        $scope.consultation.observations.push(obs);
                    });
                }
            });
        }

В приведенном выше коде, когда я помещаю объект в другой массив, как я могу опустить клавиши possibleAnswers?Есть ли способ опустить?

Спасибо большое людям!Оба ответа верны и дали точный правильный результат.К сожалению, я могу выбрать только 1 ответ как правильный, и он будет случайным.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Это рекурсивное пропускание, использующее _.transform() для итерации и игнорирования одного или нескольких ключей в массиве:

const omitRecursive = (keys, obj) => _.transform(obj, (acc, v, k) => {
  // if key is view, and it and has an id value replace it with equivalent from views
  if(keys.includes(k)) return;
  
  acc[k] = _.isObject(v) ? omitRecursive(keys, v) : v;
});

const data = [{"observations":[{"possibleAnswers":[],"groupMembers":[{"possibleAnswers":[]},{"groupMembers":[{"possibleMembers":[]},{"possibleMembers":[]}]}]}]},{"observations":"Same as above"},{"observations":"Same as above"}];

const result = omitRecursive(['possibleAnswers'], data);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 17 декабря 2018

Эта функция удалит все «возможные ответы», если она вызывается в исходном массиве, например removeKey(arr, 'possibleAnswers')

function removeKey(objOrArr, keyToRemove) {
  if (Array.isArray(objOrArr)) {
    objOrArr.forEach(o => removeKey(o, keyToRemove));
  } else if (typeof objOrArr === 'object') {
    delete objOrArr[keyToRemove];
    Object.values(objOrArr).forEach(v => removeKey(v, keyToRemove));
  }
}
...