【问题标题】:Sort array elements on JavaScript在 JavaScript 上对数组元素进行排序
【发布时间】:2021-02-16 12:05:34
【问题描述】:

我有一个数组,每个子数组包含不同顺序的不同位置:

[
  ["apple(2)", "banana(5)"],
  ["peach(3)", "banana(1)"],
  ["apple(1)"]
]

我需要在 JavaScript (ES6) 上对其进行排序,我希望得到一个像这样的数组:

[
  ["apple(2)", "banana(5)", "peach(0)"],
  ["apple(0)", "banana(1)", "peach(3)"],
  ["apple(1)", "banana(0)", "peach(0)"]
]

每个子数组的顺序应该相同。如果子数组没有某个位置,我需要用0 值添加它。我可以使用map()sort() 之类的函数还是需要手动比较?

【问题讨论】:

  • 是否有可能值的列表?还是必须从数组中计算出来?
  • 请解释一下你是如何得到输出格式的。
  • @epascarello 我只需要比较和排序单词,而不是数字,数字是唯一的
  • 我知道....但是单词列表是否已知?答案的复杂性取决于此。
  • 所以很复杂。您需要首先遍历所有数组并获取可能的单词。之后,您需要重新循环并添加缺少的单词并进行排序。有很多方法可以做到。

标签: javascript arrays sorting dictionary sub-array


【解决方案1】:

这是函数式编程方法,使用Mapreduce

const data = [['apple(2)', 'banana(5)'],['peach(3)', 'banana(1)'],['apple(1)'],];

// Create a Map with default values for each name, i.e. with "(0)":
let names = new Map(data.flat().map(item => [item.replace(/\d+/, ""), item.replace(/\d+/, "0")]));
let result = data.map(row =>
    [...row.reduce((map, item) => 
        map.set(item.replace(/\d+/, ""), item), // Overwrite default
        new Map(names) // Start with clone of original Map
    ).values()]
);
console.log(result);

【讨论】:

  • 我刚刚将.flat() 更改为.reduce((a, b) => a.concat(b), []),因为不幸的是我需要支持EdgeHTML(Edge 12+)。
  • 如果您不支持data.flat(),那么[].concat(...data) 可以替代。
【解决方案2】:

您必须循环才能使用密钥。然后,您必须再次循环以填充丢失的键。方法有很多种,这是一种。

var data = [
  ["apple(2)", "banana(5)"],
  ["peach(3)", "banana(1)"],
  ["apple(1)"]
];

// match string and number
var re = /([^(]+)\((\d+)\)/;

// Loop over and find all of the keys
var grouped = data.reduce((info, subset, index) => {
  subset.forEach(item => {
    // find the key and count
    var parts = item.match(re);
    // have we seen this key?
    if (!info[parts[1]]) {
      // if not create an array
      info[parts[1]] = Array(data.length).fill(0);
    }
    // set the key index with the count
    info[parts[1]][index] = parts[2];
  })
  return info;
}, {});

// loop over the groups and fill in the set
Object.entries(grouped).forEach(([key, counts], colIndex) => {
  counts
    .forEach((cnt, rowIndex) => {
      data[rowIndex][colIndex] = `${key}(${cnt})`;
    })
});

console.log(data);

【讨论】:

    【解决方案3】:

    首先获取唯一的单词。然后遍历数组来检查单词是否存在。如果它不存在,则根据您的条件制作单词,如果存在则将原始单词放入 tmp 数组。最后对每次迭代进行排序。顺便说一句,我使用了正则表达式替换方法来获取单词。

    const data = [
      ['apple(2)', 'banana(5)'],
      ['peach(3)', 'banana(1)'],
      ['apple(1)'],
    ];
    const words = [...new Set(data.flat().map((x) => x.replace(/[^a-z]/gi, '')))];
    const ret = data.map((x) => {
      const tmp = [];
      const newX = x.map((y) => y.replace(/[^a-z]/gi, ''));
      for (let i = 0, l = words.length; i < l; i += 1) {
        if (newX.includes(words[i])) tmp.push(x.shift());
        else tmp.push(`${words[i]}(0)`);
      }
      return tmp.sort();
    });
    console.log(ret);

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 2021-12-03
      • 1970-01-01
      • 2020-01-07
      • 2016-02-01
      • 2015-06-28
      • 2016-04-11
      • 2017-12-16
      • 1970-01-01
      相关资源
      最近更新 更多