【问题标题】:Filter and sort a JavaScript array过滤和排序 JavaScript 数组
【发布时间】:2016-09-03 03:08:04
【问题描述】:

我有一个这样的数组:

[{
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 6.4
    }
}, {
    "number": "3",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}, {
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}]

我正在尝试使用以下条件创建一个新数组:

  1. 获得每个号码 (array.number) 的最高评分 (array.rating.average)

输出应该是:

[{
    "number": "4",
    "fileName": "fileXX",
    "rating": {
        "average": 6.4
    }
}, {
    "number": "3",
    "fileName": "fileXX",
    "rating": {
        "average": 5.4
    }
}
}]

我刚刚设法按最高评分排序:

array.sort(function(a , b) {
    return a.rating.average - b.rating.average;
});
array.reverse();

但是,现在,我只想要每个重复的 array.number 一个对象,保留具有最高 array.rating.average 的对象。

【问题讨论】:

  • 你能告诉我们你的尝试吗?
  • 因为 3 和 4 的平均评分相同。为什么选择数字 3 而不是 4?
  • @SamuelToh 我想要一个包含每个最高评级“数字”的数组。
  • @westefan 我已经浏览了这 2 个网址,并且它们都与我正在尝试做的事情有不同的结果。

标签: javascript arrays sorting


【解决方案1】:
array.sort((a, b) => {
  if(a.number === b.number) {
    // If two elements have same number, then the one who has larger rating.average wins
    return b.rating.average - a.rating.average;
  } else {
    // If two elements have different number, then the one who has larger number wins
    return b.number - a.number;
  }
});


array = array.filter((element, index) => {
  return index === 0 || element.number !== array[index-1].number;
});

对于您的测试用例,

[{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}, {
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

排序后的输出是

[{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

过滤后的最终结果:

[{
  "number": "4",
  "fileName": "fileXX",
  "rating": {
    "average": 6.4
  }
}, {
  "number": "3",
  "fileName": "fileXX",
  "rating": {
    "average": 5.4
  }
}]

【讨论】:

    【解决方案2】:

    首先,您创建一个字典以保持每个数字的最高评分:

    var data = [{
        "number": "4",
        "fileName": "fileXX",
        "rating": {
            "average": 6.4
        }
    }, {
        "number": "3",
        "fileName": "fileXX",
        "rating": {
            "average": 5.4
        }
    }, {
        "number": "4",
        "fileName": "fileXX",
        "rating": {
            "average": 5.4
        }
    }];
    
    
    var filterMap = {};
    data.forEach(function (item) {
      if (!filterMap[item.number] || filterMap[item.number].rating.average < item.rating.average) {
        filterMap[item.number] = item;
      }
    })
    
    var result = [];
    
    for (var number in filterMap) {
      result.push(filterMap[number]);
    }
    
    
    result.sort(function(a , b) {
       return b.rating.average - a.rating.average;
    });
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      arr = [{
          "number": "4",
          "fileName": "fileXX",
          "rating": {
              "average": 6.4
          }
      }, {
          "number": "3",
          "fileName": "fileXX",
          "rating": {
              "average": 5.4
          }
      }, {
          "number": "4",
          "fileName": "fileXX",
          "rating": {
              "average": 5.4
          }
      }]
      
      arr = arr.sort(function(a,b){return b.number-a.number || b.rating.average-a.rating.average}).filter(function(a,b,c){return !b || c[b-1].number != a.number});
      console.log(arr);

      我相信这会通过排序和过滤来解决你的问题。

      编辑:现在应该支持旧版浏览器。

      【讨论】:

      【解决方案4】:

      您可以简单地使用 lodash 方法按您想要按文件名、编号等排序的任何内容进行排序。

      const _ = require('lodash');
      
      var data = [{
        "number": "4",
        "fileName": "fileXX",
        "rating": {
          "average": 6.4
        }
      }, {
        "number": "3",
        "fileName": "fileXX",
        "rating": {
          "average": 5.4
        }
      }, {
        "number": "4",
        "fileName": "fileXX",
        "rating": {
          "average": 5.4
        }
      }]
      
      var result = _.sortBy(data, ['number']);
      
      console.log(result)
      
      Output:
      [ { number: '3', fileName: 'fileXX', rating: { average: 5.4 } },
        { number: '4', fileName: 'fileXX', rating: { average: 6.4 } },
        { number: '4', fileName: 'fileXX', rating: { average: 5.4 } } ]
      

      【讨论】:

      • OP 所需的输出包括过滤掉重复项,这是缺失的。
      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多