Reputation: 651
I'm trying to filter and sort my data. which is matched all value in the array it will be at the first of array.
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.log(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']},
]
I tried it filter but I cannot do the sort. This is my code.
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']},
]
Upvotes: 3
Views: 1156
Reputation: 15247
You can sort by the length of the intersection of the arrays vitaminsArray
and vitamins
. The longest result means the current object has the most items from 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.log("before sorting");
console.log(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.log("after sorting");
console.log(sorted);
Upvotes: 2
Reputation: 5054
You can do the following,
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.log(filterAndSort());
// console.log(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']},
]*/
Upvotes: 2