簡體   English   中英

使用map,reduce或filter按屬性獲取唯一值數組javascript

[英]get unique values array javascript by property using map, reduce or filter

我有這個數組,只想獲得獨特的課程和更新的 DateStart。

const classes = [{
    Course: {id: 1, Name: 'JS'},
    Name: 'JS Morning',DateStart: "2018/09/01"
}, {
    Course: {id: 1, Name: 'JS'},
Name: 'JS Afternoon',DateStart: "2018/10/15"
}, {
    Course: {id: 1, Name: 'JS'},
    Name: 'JS Night',DateStart: "2018/10/01"
}, {
    Course: {id: 2, Name: 'Jquery'},
    Name: 'JQ Morning',DateStart: "2018/10/01"
}, {
    Course: {id: 2, Name: 'Jquery'},
    Name: 'JQ Night',DateStart: "2018/09/15"
}];

例如,我的結果數組應該是:

const results = [{
    DataStart:"2018/09/01",Course{id: 1, Name: "JS"}
},{
    DataStart:"2018/09/15",Course{id: 2, Name: "Jquery"}

我知道使用 foreach 來執行此操作,但我想使用 MAP 或 REDUCE 或 FILTER。 有人可以幫我嗎?

謝謝!!! 亞歷克斯

我們可以20180901日期進行sort() ,在這種情況下更容易將日期比較為數字,替換/20180901 ,一旦我們有了排序的數組,我們就可以執行filter()以僅保留Course.Name的第一條記錄Course.Name

 var classes = [{ Course: {id: 1, Name: 'JS'}, Name: 'JS Morning',DateStart: "2018/09/01" }, { Course: {id: 1, Name: 'JS'}, Name: 'JS Afternoon',DateStart: "2018/10/15" }, { Course: {id: 1, Name: 'JS'}, Name: 'JS Night',DateStart: "2018/10/01" }, { Course: {id: 2, Name: 'Jquery'}, Name: 'JQ Morning',DateStart: "2018/10/01" }, { Course: {id: 2, Name: 'Jquery'}, Name: 'JQ Night',DateStart: "2018/09/15" }]; var diff = {} results = classes.sort((a,b)=>{ return a.DateStart.replace(/\\//g, "") - b.DateStart.replace(/\\//g, ""); }).filter(a=>{ delete a.Name if(a.Course.Name in diff){ return false; }else{ diff[a.Course.Name] = true; return true; } }) console.log(results)

 var classes = [{ Course: {id: 1, Name: 'JS'}, Name: 'JS Morning',DateStart: "2018/09/01" }, { Course: {id: 1, Name: 'JS'}, Name: 'JS Afternoon',DateStart: "2018/09/01" }, { Course: {id: 1, Name: 'JS'}, Name: 'JS Night',DateStart: "2018/09/01" }, { Course: {id: 2, Name: 'Jquery'}, Name: 'JQ Morning',DateStart: "2018/09/15" }, { Course: {id: 2, Name: 'Jquery'}, Name: 'JQ Night',DateStart: "2018/09/15" }]; var result = classes.map(x => { return { DateStart: x.DateStart, Course: x.Course } }).filter((x,i,a)=> i == a.findIndex(y => y.DateStart == x.DateStart && y.Course.id == x.Course.id && y.Course.Name == x.Course.Name)); console.log(result);

您可以使用array#reduce來獲取使用id的獨特課程。 如果您獲得重復課程,則比較DateStart並存儲先前值。 在對象累加器中獲得所有獨特的課程后,使用Object.values()獲得所有值。

 const classes = [{ Course: {id: 1, Name: 'JS'}, Name: 'JS Morning',DateStart: "2018/09/01" }, { Course: {id: 1, Name: 'JS'}, Name: 'JS Afternoon',DateStart: "2018/10/15" }, { Course: {id: 1, Name: 'JS'}, Name: 'JS Night',DateStart: "2018/10/01" }, { Course:{id: 2, Name: 'Jquery'}, Name: 'JQ Morning',DateStart: "2018/10/01" }, { Course: {id: 2, Name: 'Jquery'}, Name: 'JQ Night',DateStart: "2018/09/15" }], result = Object.values(classes.reduce((r,{Course, DateStart}) => { if(r[Course.id]) { if(r[Course.id].DateStart > DateStart) r[Course.id] = {Course, DateStart}; } else r[Course.id] = {Course, DateStart}; return r; },{})); console.log(result);

您可以使用以下解決方案通過使用 map 的屬性從數組中獲取唯一值:

classes.map( c => ({ DataStart: c.DateStart, Course: c.Course }))

暫無
暫無

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

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