【问题标题】:Javascript implement deep filtering in nested json dataJavascript在嵌套的json数据中实现深度过滤
【发布时间】:2018-01-29 14:44:44
【问题描述】:

我有以下数据结构

tasks = [{
   id: 1,
   name: "task1",
   subtasks: [
      {
         id: 4,
         name: "task2",
         subtasks: [{
            id: 11,
            name: "task to remove",
            completed: false
         }]
      },
      {
         id: 6,
         name: "task to remove",
         subtasks: []
      },
      {
         id: 7,
         name: "parent task to keep",
         subtasks: [{
            id: 11,
            name: "task to keep",
            completed: true
         }]
      }
   ]
},
{
  id: 44,
  name: "task to keep",
  subtasks: [{
    id: 55,
    name: "task to keep",
    completed: true
  },
  {
    id: 66,
    name: "task to delete",
    completed: false
  }
  ]
}
]

无限级别的嵌套,只有叶子任务完成了标志,我只需要过滤掉那些已经完成的任务并将它们保留在他们的父母那里。

我查看了 lodash,但它似乎没有深层过滤器。我现在正在考虑使用树遍历来过滤掉任务。

有没有一种简单的方法可以用 lodash 实现类似的东西?

【问题讨论】:

  • 请添加想要的结果以及您尝试过的内容。

标签: javascript lodash


【解决方案1】:

您想要一个 lodash 解决方案。我相信这个递归函数可以解决问题。

function completed (task) {
    // if it is a leaf node, just return true when it is completed
    if (_.has(task,'completed')) {
        return task.completed;
    }

    // if it has subtasks, then use our filter on all the subtasks ...
    if (_.has(task,'subtasks')) {
        task.subtasks = _.filter(task.subtasks, completed);

        // ... and only return true if there are subtasks left after filtering
        return task.subtasks.length;
    }

}

console.log(_.filter(tasks,completed));

【讨论】:

  • 请注意,此解决方案会改变原始数组。
【解决方案2】:

好吧,你想要的可以通过一个recussive function来实现,但是(因为你想要简单的解决方案)这里是一个带有回调作为JSON.parse的第二个参数的解决方案,我们将从字符串中解析它;但是,请注意,简单并不总是意味着高效!

//your data
tasks = [{
        id: 1,
        name: "task1",
        subtasks: [{
                id: 4,
                name: "task2",
                subtasks: [{
                    id: 11,
                    name: "task to remove",
                    completed: false
                }]
            },
            {
                id: 6,
                name: "task to remove",
                subtasks: []
            },
            {
                id: 7,
                name: "parent task to keep",
                subtasks: [{
                    id: 11,
                    name: "task to keep",
                    completed: true
                }]
            }
        ]
    },
    {
        id: 44,
        name: "task to keep",
        subtasks: [{
                id: 55,
                name: "task to keep",
                completed: true
            },
            {
                id: 66,
                name: "task to delete",
                completed: false
            }
        ]
    }
]

//solution
var finalTasks = JSON.parse(JSON.stringify(tasks), (k, v) => {
    if (Array.isArray(v)) {
        return v.filter(u => u);
    } else if (typeof v === "object" && !(v.subtasks && v.subtasks.length) && !v.completed) {
        return undefined;
    }
    return v;
});

console.log(finalTasks);

【讨论】:

  • 你能解释一下'k'、'v'和'u'是什么意思吗?短变量不是自我解释的
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2019-08-10
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2019-01-29
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多