javascript - 与父对象一起获取深层对象

标签 javascript underscore.js lodash

下面是示例数据(分层数据),我只想要具有 IsChecked = true 的对象数组及其所有具有条件 isChecked =true 的子对象。

$scope.treedData = [{
        "id": "1",
        "text": "Women",
        "parentId": null,
        "IsChecked": true,
        "children": [{
            "id": "4",
            "text": "Jeans",
            "parentId": "1",
            "IsChecked": true,
            "children": [
                { "id": "5", "text": "Jeans child", "parentId": "4", "IsChecked": true, "children": [] },
                { "id": "6", "text": "Jeans child child", "parentId": "4", "IsChecked": false, "children": [] }
            ]
        }]
    },
    {
        "id": "2",
        "text": "Men",
        "parentId": null,
        "IsChecked": false,
        "children": [{ "id": "10", "text": "Sweatshirts", "parentId": "2", "IsChecked": false, "children": [] }]
    },
    {
        "id": "3",
        "text": "Kids",
        "parentId": null,
        "IsChecked": true,
        "children": [{ "id": "12", "text": "Toys", "parentId": "3", "IsChecked": false, "children": [] }]
    }
];

最佳答案

您可以使用 reduce 来实现此目的,并使用递归将过滤器应用到子层次结构:

var treeData = [
  { "id": "1", "text": "Women", "parentId": null, "IsChecked": true,
   "children": [
     { "id": "4", "text": "Jeans",  "parentId": "1", "IsChecked": false, "children":[
       { "id": "5", "text": "Jeans child",  "parentId": "4", "IsChecked": true, "children":[]  },
       { "id": "6", "text": "Jeans child child",  "parentId": "4", "IsChecked": false, "children":[]  }
     ]  }]
  },
  { "id": "2", "text": "Men", "parentId": null,  "IsChecked": false,
   "children": [{ "id": "10", "text": "Sweatshirts", "parentId": "2", "IsChecked": false, "children":[]}]
  },
  {"id": "3", "text": "Kids", "parentId": null,  "IsChecked": true,
   "children": [{ "id": "12", "text": "Toys", "parentId": "3", "IsChecked": false, "children":[] }]
  }
];

checkedTreeData = treeData.reduce(function checkedOnly (acc, obj) {
  return obj.IsChecked 
    ? acc.concat(Object.assign({}, obj, { children: obj.children.reduce(checkedOnly, []) }))
    : acc;
}, []);

console.log(checkedTreeData);
.as-console-wrapper { max-height: 100% !important; top: 0; }

注意:在 JavaScript 中,有一条不成文的规则,属性名称不得使用首字母大写,因此 IsChecked 将使用小写的 i:已检查。首字母大写通常用于构造函数(类)。

替代.filter()

function filterChecked(treeData) {
  return treeData.filter(obj => obj.IsChecked)
    .map(obj => Object.assign({}, obj, obj.children ? 
                { children: filterChecked(obj.children) } : {}))
}

var treeData = [
  { "id": "1", "text": "Women", "parentId": null, "IsChecked": true,
   "children": [
     { "id": "4", "text": "Jeans",  "parentId": "1", "IsChecked": false, "children":[
       { "id": "5", "text": "Jeans child",  "parentId": "4", "IsChecked": true, "children":[]  },
       { "id": "6", "text": "Jeans child child",  "parentId": "4", "IsChecked": false, "children":[]  }
     ]  }]
  },
  { "id": "2", "text": "Men", "parentId": null,  "IsChecked": false,
   "children": [{ "id": "10", "text": "Sweatshirts", "parentId": "2", "IsChecked": false, "children":[]}]
  },
  {"id": "3", "text": "Kids", "parentId": null,  "IsChecked": true,
   "children": [{ "id": "12", "text": "Toys", "parentId": "3", "IsChecked": false, "children":[] }]
  }
];


console.log(filterChecked(treeData));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 与父对象一起获取深层对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265744/

相关文章:

javascript - Rxjs 中的映射序列

javascript - 为什么 jQuery 的 :visible selector work differently when filtered?

javascript - 如何从 Chrome 扩展程序中的新选项卡中打开 URL?

typescript - 如何在 TypeScript 中使用 lodash.mixin

javascript - if 语句 JavaScript、数学在我的 else 语句中不起作用,我做错了什么?

javascript - 如何使用 CoffeeScript 覆盖 Backbone Marionette 的区域?

javascript - 如何使用underscore js进行IN(SQL)操作?

javascript - Lodash map 中的 promise

javascript - 如何将 lodash 的合并与自定义时间戳属性结合使用

javascript - 仅通过带有 underscore.js 的某些字段在对象数组之间进行交集和等于