Javascript filter and sort value

Viewed 123

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']},
   ]
2 Answers

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']},
]*/

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);

Related