У меня есть массив объектов. Нужно выбрать для каждого 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' }
]
Я не понял причем тут сортировка, хотя вроде и логично выглядит.
У меня получилось как-то так:
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);
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости