получить массив уникальных значений javascript по свойству, используя карту, уменьшить или отфильтровать - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть этот массив, и я хочу получить только уникальные курсы и более поздний 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. Кто-нибудь может мне помочь?

Спасибо !!! Alex

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Вы можете использовать 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);
0 голосов
/ 03 сентября 2018

Сначала мы можем сделать sort() по дате, в этом случае проще сравнивать даты как числа, заменяя / как 20180901, когда у нас есть отсортированный массив, мы можем сделать filter(), чтобы сохранить только первая запись 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)
0 голосов
/ 05 сентября 2018

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);
0 голосов
/ 03 сентября 2018

Вы можете использовать следующее решение для получения уникальных значений из массива по свойству с помощью map:

classes.map( c => ({ DataStart: c.DateStart, Course: c.Course }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...