深入集合

时间:2017-05-18 09:29:11

标签: javascript reduce flatten

我需要得到所有" id"和"名称"我有一个大集合。一个数组ob对象,它包含带有对象(等)的数组。

我无法在没有手动执行多种级别的操作的情况下使用它,这很难看。

我正在使用Lodash,所以使用它的解决方案很可爱。

这是集合的样子:

[
  {
    "id": 1,
    "name": "Living",
    "numberStories": 0,
    "subcategories": {
      "data": [
        {
          "id": 2,
          "name": "Fashion",
          "numberStories": 0,
          "subcategories": {
            "data": [
              {
                "id": 3,
                "name": "Accessories",
                "numberStories": 0,
                "subcategories": {
                  "data": [

                  ]
                }
              },
              {
                "id": 4,
                "name": "Kid's Fashion",
                "numberStories": 0,
                "subcategories": {
                  "data": [

                  ]
                }
              }, (... etc)

因此,它需要查看每个对象数组中的子类别并收集ID和名称,以便最终得到所有级别的所有ID名称。

感谢。

3 个答案:

答案 0 :(得分:1)

如上所述,这可能更容易使用原生javascript,因为它是递归的。这与前一个答案的想法相同,但使用ES6的一些很酷的功能(解构,休息参数,箭头函数,默认参数),它将保存对父ID的引用,以便您可以在需要时重建类别树



const categories=[{id:1,name:"Living",numberStories:0,subcategories:{data:[{id:2,name:"Fashion",numberStories:0,subcategories:{data:[{id:3,name:"Accessories",numberStories:0,subcategories:{data:[]}},{id:4,name:"Kid's Fashion",numberStories:0,subcategories:{data:[]}}]}}]}}];

const flattenCategories = (categories, parent = null, ret = []) =>
  categories.reduce((acc, { id, name, subcategories: { data } }) =>
    acc.concat(
      { id, name, parent },
      ...flattenCategories(data, id)
    )
  , ret)


console.log(
  flattenCategories(categories)
)

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




答案 1 :(得分:0)

没有必要为此目的使用lodash。使用.reduce()的简单递归函数为您完成工作

function flattenId(inArray){
 return inArray.reduce(function(output, elem){
   output.push(elem.id);
   return output.concat(flattenId(elem.subcategories.data));
  }, []);
}

答案 2 :(得分:0)

这是一个使用 object-scan 的解决方案。根据您的用例,使用库可能有点矫枉过正,但如果需要,它可以为您提供更大的灵活性

// const objectScan = require('object-scan');

const categories = [{ id: 1, name: 'Living', numberStories: 0, subcategories: { data: [{ id: 2, name: 'Fashion', numberStories: 0, subcategories: { data: [{ id: 3, name: 'Accessories', numberStories: 0, subcategories: { data: [] } }, { id: 4, name: "Kid's Fashion", numberStories: 0, subcategories: { data: [] } }] } }] } }];

const r = objectScan(['**[*].id'], {
  filterFn: ({ context, value, parents }) => {
    context.push({
      id: value,
      name: parents[0].name,
      parent: parents.length > 2 ? parents[3].id : null
    });
  }
})(categories, []);

console.log(r);
// => [ { id: 4, name: "Kid's Fashion", parent: 2 }, { id: 3, name: 'Accessories', parent: 2 }, { id: 2, name: 'Fashion', parent: 1 }, { id: 1, name: 'Living', parent: null } ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.8.0"></script>

免责声明:我是object-scan

的作者