javascript - 从找到匹配项的数组中删除对象时遇到问题

标签 javascript arrays object

我有以下功能,将从数组中删除对象。它还返回没有删除项目的数组树。我的问题是,当我的 objToFindBy 为 null 时,它会删除找到 {group: null} 的所有内容,但是如果我设置 objToFindBy {group: 'some string'}

此代码应删除 objToFindBy 匹配的所有匹配项,示例 {group: null} 将在组为 null 的任何地方找到并删除所有对象,然后返回没有被删除对象的完整树

findAndDeleteAll(tree, 'items', {group: null}) // work and delete all where match. then returns the tree without deleted objects

findAndDeleteAll(tree, 'items', {group: 'd575c91f-4765-4073-a948-5e305116610c'}) // promise rejection
const tree ={
    "type": "app",
    "info": "Custom Layout",
    "items": [
      {
        "id": "d575c91f-4765-4073-a948-5e305116610c",
        "title": "Fc",
        "group": null
      },
      {
        "id": "890d5a1e-3f03-42cd-a695-64a17b6b9bea",
        "title": null,
        "group": null
      },
      {
        "id": "cbe00537-0bb8-4837-8019-de48cb04edd6",
        "title": null,
        "group": "d575c91f-4765-4073-a948-5e305116610c",
      },
      {
        "id": "b8751c32-2121-4907-a229-95e3e49bcb39",
        "title": null,
        "group": "d575c91f-4765-4073-a948-5e305116610c"
      }
    ],
    "Children": []
  }
var findAndDeleteAll = function findAndDeleteAll(tree, childrenKey, objToFindBy) {
      var treeModified = false;
      var findKeys = Object.keys(objToFindBy);
      var findSuccess = false;
      findKeys.forEach(function (key) {
        (0, _lodash2.default)(tree[key], objToFindBy[key]) ? findSuccess = true : findSuccess = false;
      });
      if (findSuccess) {
        Object.keys(tree).forEach(function (key) {
          return delete tree[key];
        });
        return tree;
      }
      function innerFunc(tree, childrenKey, objToFindBy) {
        if (tree[childrenKey]) {
          var _loop = function _loop(index) {
            var findKeys = Object.keys(objToFindBy);
            var findSuccess = false;
            findKeys.forEach(function (key) {
              (0, _lodash2.default)(tree[childrenKey][index][key], objToFindBy[key]) ? findSuccess = true : findSuccess = false;
            });
            if (findSuccess) {
              tree[childrenKey].splice(index, 1);
              treeModified = true;
            }
            if (tree[childrenKey][index].hasOwnProperty(childrenKey)) {
              innerFunc(tree[childrenKey][index], childrenKey, objToFindBy);
            }
          };
    
          for (var index = tree[childrenKey].length - 1; index >= 0; index--) {
            _loop(index);
          }
        }
      }
      innerFunc(tree, childrenKey, objToFindBy);
      return treeModified ? tree : false;
    };

最佳答案

更短的解决方案怎么样?

const findAndDeleteAll = (tree, childrenKey, nestedKey, nestedValue) => {
  return{...tree, [childrenKey]: tree[childrenKey].filter((row) => {
    return row[nestedKey] !== nestedValue;
  })}
}
const a = findAndDeleteAll(tree, 'items', 'group', null) // work and delete all where match. then returns the tree without deleted objects

const b = findAndDeleteAll(tree, 'items', 'group', 'd575c91f-4765-4073-a948-5e305116610c') // promise rejection

console.warn(a);
console.warn(b);

关于javascript - 从找到匹配项的数组中删除对象时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70660476/

相关文章:

javascript - jQuery.data 只保存最后一个 Element 的数据

javascript - 我可以在其中附加书面内容的框

c# - 大型阵列和 LOH 碎片。公认的惯例是什么?

php - 在 PHP 中,如何使用传递给它的相同变量调用函数?

java - 在 Java 中将 MySQL 表中的行存储到数组中

javascript - 如何合并/推送 Javascript 数组中的重复值

c# - 为什么我们必须使用对象来访问类成员?

javascript - 使用semantic-ui-calendar 设置 minDate 和 maxDate

javascript - JQuery 下拉菜单上的 .each()

javascript - onClick 过滤数组并渲染数组中的剩余项目