簡體   English   中英

如何在對象數組中過濾數組?

[英]How to filter an array inside of an array of objects?

我有這個數組,我想檢查內部完成工作的日期(在這種情況下為星期一)

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?

要檢查所有三個對象中的哪一天是“完成”,您需要查看所有對象並構建一張地圖,該地圖將為您提供每一天的真假。 您可以這樣做:

 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否定表示。 那是你追求的嗎?

首先,正如我在評論中所說, event.job是一個數組,所以=== 'done'將永遠不會為真。

您需要在數組上應用.every()過濾器,而不是===

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

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

當然,這是假設Jobs屬性中的所有三個值都必須“完成”。

的jsfiddle

如果這些對象的結構是,以天為單位的每個值對應於作業中的每個值(即,以天為單位的索引0分配給作業的索引0),那么您需要更有效地設計對象。 目前的設計效率不高,也不實用。

這是一種實用的方法。 有點令人費解,但是可以完成工作。

 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"]}, ] // Keep days that occur done in all "weeks" const numWeeks = done.length; // Loop through all weeks and days to see when they are "done" const daysObj = done.map((x) => x.job.map((x) => x == "done") .map((y, index) => y ? x.days[index] : "")) .map((x) => x.filter((day) => day)) .reduce((acc, curr) => acc.concat(curr)) .reduce(function(p, c){ if (c in p) { p[c]++; } else { p[c]=1; } return p; }, {}); console.log(daysObj); // {Monday: 3, Friday: 2, Tuesday: 1} // Find days that occur done in all weeks const result = Object.keys(daysObj) .map((x) => daysObj[x] == numWeeks ? x : null) .filter((x) => x) console.log(result); // ["Monday"] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM