Wilker
Wilker

Reputation: 651

Javascript filter and sort value

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

Answers (2)

Cid
Cid

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

Md Sabbir Alam
Md Sabbir Alam

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

Related Questions