【问题标题】:Javascript filter and sort valueJavascript过滤和排序值
【发布时间】:2021-03-31 00:50:22
【问题描述】:

我正在尝试过滤和排序我的数据。它匹配数组中的所有值,它将位于数组的第一个。

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

我尝试了它的过滤器,但我无法进行排序。这是我的代码。

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

【问题讨论】:

  • 操作。对不起,我错字了。谢谢你提出来!
  • 你没有调用排序函数

标签: javascript sorting filter


【解决方案1】:

您可以按intersection of the arrays vitaminsArrayvitamins 的长度排序。最长的结果意味着当前对象拥有来自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);

【讨论】:

    【解决方案2】:

    您可以执行以下操作,

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

    【讨论】:

    • 感谢您花时间分享代码并解决了我的问题 =)
    • 更新了过滤维生素的代码。
    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2019-08-12
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多