首页 > 解决方案 > 根据某些属性过滤嵌套数组

问题描述

我有一个数组:

var data = [{
  "name": "Main Hobbies",
  "checked": false,
  "children": [{
    "name": "Dance",
    "checked": false,
    "children": [{
      "name": "Salsa",
      "checked": true
    }, {
      "name": "Solo",
      "checked": false
    }]
  }, {
    "name": "Sports",
    "checked": false,
    "children": [{
      "name": "Cricket",
      "checked": true
    }]
  }]
}, {
  "name": "Game",
  "checked": false,
  "children": [{
    "name": "PUBG",
    "checked": false
  }, {
    "name": "Cricket",
    "checked": false
  }, {
    "name": "Football",
    "checked": true
  }]
}]

function removeFalseElem(arr) {
  arr.forEach(element => {
    if (Array.isArray(element.children) && element.children.length > 0) {
      element.children = element.children.filter(e => {
        return e.checked === true
      });
      element.children.map(e => {
        delete e['id'], delete e['checked']
      })
    } else {
      removeFalseElem(element.children);
    }
    delete element['id'], delete element['checked'];
  });

}
removeFalseElem(data);
console.log(data);

我如何映射namekey和包含 where is . 应该包含,因为它已被检查。我只想颠倒这个问题的方法childrenarraycheckedtrueMain hobiesSalsa

输出应该像

{
  "Main Hobbies": { Dance: ["Salsa"], Sports: ["Cricket"] },
  Game: ["Football"]
}

必须只保留checked:true

标签: javascriptarraysecmascript-6

解决方案


使用以下辅助方法,遍历项目并构建所需的输出。
1) 过滤器——给定一个数组,返回为真的名称
2) hasGrandChild——给定对象是否有子对象,子对象是否有子对象。

const process = data => {
  const filter = arr => arr.filter(x => x.checked).map(x => x.name);
  const hasGrandChild = arr => arr.length > 0 && "children" in arr[0];
  const output = {};

  data.forEach(({ name, children }) => {    
    if (hasGrandChild(children)) {
      const obj = {};
      children.forEach(ch => (obj[ch.name] = filter(ch.children)));
      output[name] = obj;
    } else {
      output[name] = filter(children);
    }
  });
  return output;
};

var data = [
  {
    name: "Main Hobbies",
    checked: false,
    children: [
      {
        name: "Dance",
        checked: false,
        children: [
          {
            name: "Salsa",
            checked: true
          },
          {
            name: "Solo",
            checked: false
          }
        ]
      },
      {
        name: "Sports",
        checked: false,
        children: [
          {
            name: "Cricket",
            checked: true
          }
        ]
      }
    ]
  },
  {
    name: "Game",
    checked: false,
    children: [
      {
        name: "PUBG",
        checked: false
      },
      {
        name: "Cricket",
        checked: false
      },
      {
        name: "Football",
        checked: true
      }
    ]
  }
];

console.log(process(data));


推荐阅读