如何过滤对象数组中的数组?

时间:2017-11-15 00:35:40

标签: javascript

我有这个数组,我想查看里面完成工作的日子。(在本例中是星期一)

const done = [
 {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "not yet", "done"]},
 {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "done", "done"]},
 {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "not yet", "not yet"]},
]

 const freeTime = done
  .filter((event) => event.job === 'done')
console.log(freeTime) // I get nothing here?

3 个答案:

答案 0 :(得分:1)

检查哪一天已完成'在所有三个对象中,你需要查看它们并构建一个每天都会给你真或假的地图。你可以这样做:



const done = [
    {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "not yet", "done"]},
    {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "done", "done"]},
    {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "not yet", "not yet"]},
   ]

var map = done.reduce((a, c ) => {
    c.days.forEach((day, i) => {
        a[day] =  ((a[day] == undefined || a[day] ) && c.job[i] === "done") || false
    })
    return a
}, {})

console.log(map)




这会导致每天truefalse被忽略。那是你之后的事吗?

答案 1 :(得分:0)

首先,正如我在评论中所说,event.job是一个数组,因此=== 'done'永远不会评估为真。

您需要在数组上应用.every()过滤器,而不是===

const freeTime = done.filter((event) => event.job.every(isDone) )

function isDone(status){
  return status == "done";
}

这当然是假设工作中的所有三个值都必须完成'。

JSFiddle

如果这些对象的结构是以天为单位的每个值对应于作业中的每个值(即,将索引0(以天为单位)分配给作业的索引0),则需要更有效地设计对象。目前的设计效率不高也不实用。

答案 2 :(得分:0)

这是一种功能性的方法。有点复杂,但它完成了工作。



import Data.List
count n ys = length (intersect ys (ele n))