Я пытаюсь фильтровать и сортировать свои данные. которому соответствует все значение в массиве, оно будет первым из массива.
const fruits = [
{name: 'banana', vitamins: ['Vitamin_C2', 'Vitamin_B']},
{name: 'orange', vitamins: ['Vitamin_B', 'Vitamin_A1', 'Vitamin_D']},
{name: 'apple', vitamins: ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B']},
]
const vitaminsArray = ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B'];
function filterAndSort(vitaminsArray) {
// enter amazing code here :P
}
// console.info(filterAndSort) expect output. it will filter vitamins object and sort the most on the first of the object.
[
{name: 'apple', vitamins: ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B']},
{name: 'banana', vitamins: ['Vitamin_C2', 'Vitamin_B']},
{name: 'orange', vitamins: ['Vitamin_B', 'Vitamin_A1', 'Vitamin_D']},
]
Я пробовал это фильтровать, но я не могу сделать сортировку. Это мой код.
const filtered = fruits.filter(fruit => {
return vitaminsArray.some((type) => fruit.vitamins.includes(type));
})
// output
[
{name: 'banana', vitamins: ['Vitamin_C2', 'Vitamin_B']},
{name: 'apple', vitamins: ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B']},
{name: 'orange', vitamins: ['Vitamin_B', 'Vitamin_A1', 'Vitamin_D']},
]
Вы не вызвали функцию сортировки
Вы можете сделать следующее,
const fruits = [
{name: 'banana', vitamins: ['Vitamin_C2', 'Vitamin_B']},
{name: 'orange', vitamins: ['Vitamin_B', 'Vitamin_A1', 'Vitamin_D']},
{name: 'apple', vitamins: ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B']},
]
const vitaminsArray = ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B'];
function filterAndSort() {
return fruits.sort((a,b) => {
a.vitamins = a.vitamins.filter(item => vitaminsArray.includes(item));
b.vitamins = b.vitamins.filter(item => vitaminsArray.includes(item));
let aMatch = a.vitamins.length;
let bMatch = b.vitamins.length;
return bMatch - aMatch;
});
}
console.info(filterAndSort());
// console.info(filterAndSort) expect output. it will filter vitamins object and sort the most on the first of object.
/* [
{name: 'apple', vitamins: ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B']},
{name: 'banana', vitamins: ['Vitamin_C2', 'Vitamin_B']},
]*/
Спасибо за то, что поделились кодом и решили мою проблему =)
Обновлен код для фильтрации витаминов.
Вы можете сортировать по длине пересечения массивовvitaminsArray
и vitamins
. Самый длинный результат означает, что текущий объект имеет наибольшее количество элементов из vitaminsArray
const fruits = [
{name: 'banana', vitamins: ['Vitamin_C2', 'Vitamin_B']},
{name: 'orange', vitamins: ['Vitamin_B', 'Vitamin_A1', 'Vitamin_D']},
{name: 'apple', vitamins: ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B']},
];
const vitaminsArray = ['Vitamin_C2', 'Vitamin_C', 'Vitamin_B'];
const filtered = fruits.filter(fruit => {
return vitaminsArray.some((type) => fruit.vitamins.includes(type));
});
console.info("before sorting");
console.info(filtered);
const sorted = filtered.sort((a, b) => {
return vitaminsArray.filter(value => b.vitamins.includes(value)).length - vitaminsArray.filter(value => a.vitamins.includes(value)).length;
})
console.info("after sorting");
console.info(sorted);
опс. извините я опечатка. спасибо что подняли!