【问题标题】:How to filter based on elements in an array?如何根据数组中的元素进行过滤?
【发布时间】:2019-08-09 03:35:19
【问题描述】:

我有如下多个数组如下:

//Condition one
var categorys = [1, 2];

//useType = 0,Return useType=0 element

//useType = 1,Returns the same categorys element as c_id

var data = [
  {c_id:0, name:'phone', useType:0},
  {c_id:1, name: "milk", useType:1},
  {c_id:2, name: "apple", useType:1},
  {c_id:3, name: "orang", useType:1},
  {c_id:4, name: "red", useType:1}         
]

我做了以下尝试:

let result = data.filter((item, index) => {
  if(item.useType === 0) {
    return true
  } else if(item.useType === 1 && item.c_id === categorys[index]){
    return true
  }
  else {
    return false
  }
});

我想得到以下结果

[
  {c_id:0, name:'phone',useType:0},
  {c_id:1, name: "milk",useType:1},
  {c_id:2, name: "apple",useType:1}
]

但我只能得到一个

[
  {c_id:0, name:'phone',useType:0},
]

你能帮帮我吗?

【问题讨论】:

    标签: javascript arrays object filter javascript-objects


    【解决方案1】:

    您可以使用Array.prototype.includes() 来检查categories 数组是否包含特定的c_id 值:

    const categories = [1, 2];
    
    const data = [
      {c_id: 0, name: "phone", useType: 0},
      {c_id: 1, name: "milk", useType: 1},
      {c_id: 2, name: "apple", useType: 1},
      {c_id: 3, name: "orang", useType: 1},
      {c_id: 4, name: "red", useType: 1}         
    ];
    
    const result = data.filter(({useType, c_id}) =>
        useType === 0 || useType === 1 && categories.includes(c_id));
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      您可以使用.filter().includes() 方法来获得所需的输出:

      const categorys = [1, 2];
      
      const data = [
        {c_id:0, name:'phone',useType:0},
        {c_id:1, name: "milk",useType:1},
        {c_id:2, name: "apple",useType:1},
        {c_id:3, name: "orang",useType:1},
        {c_id:4, name: "red",useType:1}         
      ];
      
      const result = data.filter(
        ({ c_id, useType }) => ((useType == 0) || (useType == 1 && categorys.includes(c_id)))
      );
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 非常感谢您的回答,我对这种写法感到惊讶。
      • c_id == 0 根据问题中概述的逻辑应该是useType == 0
      • @RobbyCornelissen 感谢您的意见。我已经更新了我的答案。
      【解决方案3】:

      你需要使用includes:

      let result = data.filter((item,index)=>{
          if(item.useType === 0){
             return true
          }else if(item.useType === 1 && categorys.includes(item.c_id)){
              return true
          }
          else{
             return false
          }
      });
      

      但为了避免对类别数组进行迭代,您可以将其设为这样的对象,从而提高性能:

      var categories = {
        "1": true,
        "2": true
      };
      
      var data = [
        {c_id:0, name:'phone',useType:0},
        {c_id:1, name: "milk",useType:1},
        {c_id:2, name: "apple",useType:1},
        {c_id:3, name: "orang",useType:1},
        {c_id:4, name: "red",useType:1}         
      ]
      
      let result = data.filter((item,index)=>{
          if(item.useType === 0){
             return true
          }
          
          if(item.useType === 1 && categories[item.c_id] === true){
              return true
          }
          
          return false
      });
      
      console.log(result);

      【讨论】:

      • 非常感谢您的回答,这是一个很好的方法和建议
      猜你喜欢
      • 2020-07-15
      • 2014-02-11
      • 2016-07-01
      • 2017-06-20
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多