【问题标题】:How to omit a particular key while pushing json objects to an array?将json对象推送到数组时如何省略特定键?
【发布时间】:2019-05-17 11:18:04
【问题描述】:

所以,我有一个 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 个正确答案,而且是随机的。

【问题讨论】:

  • 递归搜索possibleAnswers键和delete它们?
  • @CertainPerformance 我该怎么做?我还将尝试发布 JSON ,以便您更清楚地了解我需要什么
  • 如果您可以发布您开始使用的数组的示例,它将帮助您获得更好的答案。
  • @MarkMeyer 是的。将发布 JSON
  • @MarkMeyer 对不起。我将发布一个最小的示例

标签: javascript arrays angularjs json lodash


【解决方案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>

【讨论】:

  • 非常感谢!会试一试,让你知道!
  • 你能指导我提高我的 JS 技能吗?
  • 我真的很喜欢这本书:JavaScript:好的部分 • Douglas Crockford,学习 JavaScript 设计模式 • Addy Osmani,Javascript Allongé • Reginald Braithwait,
  • 谢谢!肯定会检查这些
  • 我真的很喜欢eggheadfreecodecamp.org 祝你好运!
【解决方案2】:

如果在您的原始数组(如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));
  }
}

【讨论】:

  • 非常感谢。会试一试,让你知道!
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多