【问题标题】:Multidimensional array of an unknown size in JavaScriptJavaScript中未知大小的多维数组
【发布时间】:2019-04-27 12:03:04
【问题描述】:

真的很难理解这个问题...... 我正在尝试将数组中的项目排序到另一个数组中,但已分类。我的代码目前正在运行,但问题是我需要知道“排序”数组的大小。目前,有四个条目与“数据”一起使用。前两个 data.cat 与 n 进行比较,它们的 ID 被推入 sort[0]。当两个不匹配时,将 1 添加到 c。然后代码再次循环,将新匹配推入 sort[1] 等。

var data = [
            {"cat": 0, "id":"AAAA"},
            {"cat": 0, "id":"BBBB"},
            {"cat": 1, "id":"CCCC"},
            {"cat": 1, "id":"DDDD"},
            {"cat": 1, "id":"EEEE"},
            {"cat": 1, "id":"FFFF"}, //pseudodata
            {"cat": 1, "id":"GGGG"},
            {"cat": 2, "id":"HHHH"},
            {"cat": 2, "id":"IIII"},
            {"cat": 2, "id":"JJJJ"},
            {"cat": 3, "id":"KKKK"}
        ];

var sort = [[], [], [], [],]

function sortDates(){
    var n = 0;
    for (var i = 0; i < data.length; i++){      
        if (data[i].cat == n){
            console.log("Category " + n +" entry: " + data[i].id);
            sort[n].push(data[i].id);
        } else {
            console.log("Entry " + data[i].id + " does not match. Moving to next category...");
            n++;
            i--; 
        }
    }
}

这一切正常,但是如果我在数据数组中添加更多内容(例如 {"cat": 4, "id":"LLLL"}),程序会因“sort[n] is not a function”而崩溃”。这是因为排序数组中只有四个可用项。

所以我只是想知道,有没有办法解决这个问题?如果数据数组总是在改变大小,并且添加了更多条目/类别,我是否必须继续手动调整排序数组的大小?

【问题讨论】:

    标签: javascript arrays loops multidimensional-array 2d


    【解决方案1】:

    您可以使用logical OR || 对数组进行默认检查,如果未设置该项,则分配一个空数组。

    sort[n] = sort[n] || [];
    sort[n].push(data[i].id);
    

    顺便说一句,您可以直接使用 cat 而无需迭代 sort 数组来获取正确的索引。

    function sortDates() {
        var i, sort = [];
        for (i = 0; i < data.length; i++) {
            sort[data[i].cat] = sort[data[i].cat] || [];
            sort[data[i].cat].push(data[i].id);
        }
        return sort;
    }
    
    var data = [{ cat: 0, id: "AAAA" }, { cat: 0, id: "BBBB" }, { cat: 1, id: "CCCC" }, { cat: 1, id: "DDDD" }, { cat: 1, id: "EEEE" }, { cat: 1, id: "FFFF" }, { cat: 1, id: "GGGG" }, { cat: 2, id: "HHHH" }, { cat: 2, id: "IIII" }, { cat: 2, id: "JJJJ" }, { cat: 3, id: "KKKK" }],
        result = sortDates(data);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 绝对完美 - 谢谢!我知道有一种更有效的方法来做到这一点......所以这条线:sort[data[i].cat] = sort[data[i].cat] || []; 这基本上是说,将data[i] 推到sort[data[i].cat],或者如果sort[data[i].cat 不存在,使用逻辑或,将其推入sort中的新项目?
    • 首先正确检查,如果不是 truthy 值,如数组,然后分配一个数组,然后推送新值。
    【解决方案2】:

    使用 ES6 以更简洁的方式实现此目的的另一种方法是通过String.localeCompare 使用Array.reduce 和内部Array.sort

    var data = [{ "cat": 0, "id": "BBBB" }, { "cat": 0, "id": "AAAA" }, { "cat": 1, "id": "CCCC" }, { "cat": 1, "id": "DDDD" }, { "cat": 1, "id": "EEEE" }, { "cat": 1, "id": "FFFF" }, { "cat": 1, "id": "GGGG" }, { "cat": 2, "id": "HHHH" }, { "cat": 2, "id": "IIII" }, { "cat": 2, "id": "JJJJ" }, { "cat": 3, "id": "KKKK" } ]
    
    const result = Object.values(data.reduce((r,c) => {
      r[c.cat] = [...r[c.cat] || [], c.id].sort((a,b) => a.localeCompare(b))
      return r
    }, {}))
    console.log(result)

    String.localeCompare 在如何比较方面有多种选择(例如处理字符串中的数字、区分大小写等)

    使用Array.reduce 的想法是将对象中的条目分组,然后使用Object.values 获得所需的输出(多维数组)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2017-10-11
      • 2016-03-03
      相关资源
      最近更新 更多