【问题标题】:Filter Top X from Array of arrays从数组数组中过滤前 X
【发布时间】:2018-06-26 21:18:52
【问题描述】:

假设我们有一个包含数组的数组:

[
["2000-01-01", "xyz1@gmail.com", 1, 9, 338],
["2000-01-01", "xyz2@yahoo.com", 1, 2, 159],
["2000-01-01", "xyz3@yahoo.com", 1, 5, 462],
["2000-01-01", "xyz4@yahoo.com", 1, 6, 417],
["2000-01-01", "xyz5@gmail.com", 1, 3, 156],
["2000-01-01", "xyz6@gmail.com", 1, 8, 414],
]

我想根据最后一列获得前 2 名,即

["2000-01-01", "xyz3@yahoo.com", 1, 8, 462],
["2000-01-01", "xyz4@yahoo.com", 1, 6, 417],

我们可以使用Array.filter,但不确定在这种情况下如何使用。

【问题讨论】:

  • x 动态的吗?
  • 不,让我们说前 3 名。
  • var top2 = arr.sort((a, b) => b[4] - a[4]).slice(0, 2);.
  • 任何x: var top2 = arr.sort((a, b) => b[4] - a[4]).slice(0, x);
  • @ibrahimmahrir:与其在 cmets 中发布代码来回答问题,为什么不发布答案?它更容易格式化,更容易阅读,并导致 OP 能够接受你基本上已经写好的答案。

标签: javascript arrays sorting typescript


【解决方案1】:

您可以按索引4 处的元素降序排序并取前两个元素。

此提案具有destructuring assignment,其中一个数组用于解构,属性4 被采用并重命名为a rsp。到b

例子:

                                                  vvv
{ 4: a } = ["2000-01-01", "xyz1@gmail.com", 1, 9, 338]
  ^

结果

a = 338

var array = [["2000-01-01", "xyz1@gmail.com", 1, 9, 338], ["2000-01-01", "xyz2@yahoo.com", 1, 2, 159], ["2000-01-01", "xyz3@yahoo.com", 1, 5, 462], ["2000-01-01", "xyz4@yahoo.com", 1, 6, 417], ["2000-01-01", "xyz5@gmail.com", 1, 3, 156], ["2000-01-01", "xyz6@gmail.com", 1, 8, 414]],
    top2 = array.sort(({ 4: a }, { 4: b }) => b - a).slice(0, 2);

console.log(top2);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 为什么我们必须做({ 4: a }, { 4: b }) => b - a,我们不能只做类似({ 4: a }) => a 的事情吗?
  • @user3242013 因为Array#sort通过一次比较两个元素进行排序。
  • 你有两个参数要销毁。
  • 请解释代码,以便其他人可以了解此答案的作用,以及发布的解决方案将来如何应用于其他情况(这部分是出于自身利益,因为我意识到您正在解构但我还是有点迷茫)。
  • @DavidThomas 我也是! JS 正在迅速发展。哇!我很惊讶。
【解决方案2】:

没有排序:

 function getTopTwo(array){
    let first = {4: - Infinity}, second = { 4: - Infinity};
    for(const el of array){
      if(el[4] > first[4]){
        second = first;
        first = el;
      } else if(el[4] > second[4]){
       second = el;
      }
    }
    return [first, second];
 }

【讨论】:

  • this comment 怎么样?我认为 "Top X" 是动态的。
  • @ibrahim 对,但我认为这个问题有点误导
  • 顺便说一句,您的代码不起作用。 5 > undefined === false5 < undefined === false 也是。所以你的代码总是返回两个空数组。
猜你喜欢
  • 2023-04-06
  • 2021-07-05
  • 2021-08-09
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2018-02-25
相关资源
最近更新 更多