根据值将javascript数组排序为嵌套数组

Sort a javascript array into nested arrays based on values

本文关键字:嵌套 数组 数组排序 javascript      更新时间:2023-09-26

我有一个文件名数组,如下所示:

var filesArray = [
    "120.png",
    "120s.png",
    "120t.jpg",
    "169.png",
    "169r.jpg",
    "169s.jpg",
    "169t.jpg",
    "170.png",
    "170r.jpg",
    "170s.jpg",
    "170t.jpg",
]

使用javascript (es5或6或7没关系,因为我使用babel),我想把它排序成一个嵌套数组,如下所示:

[
    [
        "120.png",
        "120s.png",
        "120t.jpg"
    ],
    [
        "170.png",
        "170r.jpg",
        "170s.jpg",
        "170t.jpg"
    ]
]

我知道,为了找到相同的基名,我必须运行regex,我已经使用filesArray[i].slice(0, -4).replace(/[^0-9'.]/g, '') )

我不知道的是如何运行array.sortarray.map来获得最终的嵌套数组。

顺便说一下,这是一个很长的文件名列表,我更喜欢在不改变原始数组的情况下最快最有效的方法。

您可以使用Map对条目进行分组。

var filesArray = ["120.png", "120s.png", "120t.jpg", "169.png", "169r.jpg", "169s.jpg", "169t.jpg", "170.png", "170r.jpg", "170s.jpg", "170t.jpg"],
    grouped = [];
filesArray.forEach(function (a) {
    var key = a.slice(0, -4).replace(/[^0-9'.]/g, ''),
        array = this.get(key);
    if (!array) {
        array = [];
        this.set(key, array);
        grouped.push(array);
    }
    array.push(a);
}, new Map);
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

var filesArray = ["120.png", "120s.png", "120t.jpg", "169.png", "169r.jpg", "169s.jpg", "169t.jpg", "170.png", "170r.jpg", "170s.jpg", "170t.jpg"];
var result = [];
var obj = filesArray.reduce(function(prev, curr, index, array) {
  var rawName = curr.match(/[0-9]/g);
  if (rawName.length) {
    var name = rawName.join('');
    if (prev[name]) {
      prev[name].push(curr);
    } else {
      prev[name] = [curr];
    }
  }
  return prev
}, {});
Object.keys(obj).forEach(function(key) {
  result.push(obj[key]);
});
console.log(result);
.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}
.as-console-row,
.as-console-row-code {
  background-color: #fff!important;
}