在将json对象推送到数组时如何省略特定键?

时间:2018-12-17 05:15:03

标签: javascript arrays angularjs json lodash

因此,我有一个对象的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 :(得分:1)

如果在原始数组(如removeKey(arr, 'possibleAnswers'))上调用,此函数将删除所有“ 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));
  }
}

答案 1 :(得分:1)

这是一个递归省略,它使用_.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>