Как выбрать макс. значение для каждого типа из массива объектов?

262
22 июля 2017, 09:19

У меня есть массив объектов. Нужно выбрать для каждого type максимальный number.

Пока что решаю задачу так:

const myArr = [{ type: 'one', number: 1, fiedld: 'aaa' },
               { type: 'one', number: 2, field: 'bb' },
               { type: 'two', number: 2, field: 'xxx' }, 
               { type: 'two', number: 1, field: 'zz' }, 
               { type: 'two', number: 3, field: 'y' }
]
sortByFields (field1, field2) {
    return ((x, y) => {
        return (x[field1] > y[field1]) - (y[field1] > x[field1]) ||
               (x[field2] > y[field2]) - (y[field2] > x[field2]);
    })
}
myArr.sort(this.sortByFields('type', 'number'));
let newArr = [];
for (let i = 0; i < myArr.length - 1; i++) {
    if (myArr[i].type !== myArr[i + 1].type) {
        newArr.push(myArr[i]);
    }
    if (i === myArr.length - 2) {
        newArr.push(myArr[i + 1]);
    }
}

Такой вариант работает, но как можно сделать это грамотнее? В результате должен получиться:

  const resArr= [
               { type: 'one', number: 2, field: 'bb' }, 
               { type: 'two', number: 3, field: 'y' }
]
Answer 1

Я не понял причем тут сортировка, хотя вроде и логично выглядит.

У меня получилось как-то так:

const myArr = [{type: 'one', number: 5 }, 
               {type: 'one', number: 2}, 
               {type: 'two', number: 2},  
               {type: 'two', number: 4},  
               {type: 'two', number: 3} 
]; 
 
let result = {}; 
 
myArr.forEach((el) => { 
    if (typeof result[el.type] == 'undefined' || el.number > result[el.type]) 
        result[el.type] = el.number;   
}); 
 
console.log(result);

Бежим через forEach.

Если в результирующем объекте нет ключа el.type, то заносим ключ и даем в качестве значения el.number этого ключа. Если ключ такой имеется, то проверяем на то, больше ли значения в текущей итерации, чем в элементе с данным ключом или нет.

ES6 style?

const myArr = [{type: 'one', number: 5 }, 
               {type: 'one', number: 2}, 
               {type: 'two', number: 2},  
               {type: 'two', number: 4},  
               {type: 'two', number: 3} 
]; 
 
 
let getMax = (array) => { 
    let result = {}; 
    array.forEach((el) => {  	 
        if (typeof result[el.type] == 'undefined' || el.number > result[el.type]) 
            result[el.type] = el.number;   
    }); 
   
    return result; 
}; 
 
console.log(getMax(myArr));

Если надо в итоге сделать так же, как исходный массив {type: какой-то тип, max: максималочка}, то можно что-то еще придумать. типа

const myArr = [{type: 'one', number: 5 }, 
               {type: 'one', number: 2}, 
               {type: 'two', number: 2},  
               {type: 'two', number: 4},  
               {type: 'two', number: 3} 
]; 
 
let filtered = {}; 
myArr.forEach((el) => { 
    if (typeof filtered[el.type] == 'undefined' || el.number > filtered[el.type]) 
        filtered[el.type] = el.number;   
}); 
 
let result = []; 
for(var i in filtered) {      
    result.push({type: i, max: filtered[i]}); 
} 
 
console.log(result);

READ ALSO
gulp. ошибка при компиляции sass

gulp. ошибка при компиляции sass

Доброго времени суток, форумчане

312
Для чего нужны классы в JavaScript?

Для чего нужны классы в JavaScript?

Читал статьи по созданию классов в JavaScript и задался вопрос: Зачем они? Для чего в ЕСМА Script 6 добавили классы? Может я не вижу того смысла и тех...

333
Как в angular 2 обновить Html

Как в angular 2 обновить Html

В общем, есть компонентВнутри конструктора пишу setinterval, там суммирую параметр компонента

356