【问题标题】:Javascript sort multi-dimensional array - a complete example?Javascript排序多维数组 - 一个完整的例子?
【发布时间】:2012-03-12 07:35:36
【问题描述】:

我不是 Javascript 专家,我在尝试将我在这里和其他地方找到的关于多维数组和排序的各种块结合在一起时遇到问题,想知道是否有人可以帮助我提供一个完整的示例?

我已经设法用通过 Ajax 读取的数据填充 localStorage。

行的格式是...

(msgXXX) (Key1:Value1|Key2:Value2|Key3:Value3|...等)

在哪里

(msgXXX) 是本地存储键;和

(Key1:Value1|Key2:Value2|Key3:Value3|...etc) 是单个连接的 localStorage 数据字符串

我想要做的是将所有这些转换为一个多维数组,我可以对其应用各种排序。例如,其中一个键称为“时间戳”,其值是一个整数,表示自 Unix 纪元以来的秒数。我想根据这个时间戳值对所有行进行排序(按降序排列 - 即最新的在前)。目前数据集只有 600 多行。

我很满意我可以进行提取、切片和切块以从 localStorage 中获取数据,但我什至不确定我在填充数组然后设置排序方面的目标是什么.

有人能指出正确的方向吗?

【问题讨论】:

    标签: javascript sorting multidimensional-array


    【解决方案1】:

    你可以这样做:

    function create(line) {
        var tokens = line.split("|");
        var obj = {};
        for (var i = 0; i < tokens.length; i++) {
            tokens[i] = tokens[i].split(":");
            obj[tokens[i][0]] = tokens[i][1];
        }
    
        return obj;
    }
    
    var arr = [];
    for (....) { // iterate over the input that each line is of key/value format
        arr.push(create(line));
    }
    
    function timestampSort(a, b) {
        if (a == b)
            return 0;
    
        return a.timestamp < b.timestamp ? -1 : 1;
    }
    
    // to sort by timestamp
    arr.sort(timestampSort);
    

    此代码以您提供的格式为每个键/值行创建一个对象。该对象将键作为属性。所有这些对象都被推入一个数组,然后通过将比较函数传递给数组的本机排序方法来对其进行排序。 当然,您可以根据需要创建任意数量的比较函数,每个函数都根据不同的属性/标准进行比较。

    您可以在此处阅读有关排序方法的更多信息:http://www.w3schools.com/jsref/jsref_sort.asp

    编辑

    sort 方法既改变了数组本身,又返回了数组,所以这样做:

    console.log(arr.sort(timestampSort));
    

    将更改实际数组并返回它,因此 console.log 将打印它。 如果您不想更改原始数组并拥有一个可以排序的副本,您可以:

    var arr2 = arr.slice();
    arr2.sort(timestampSort);
    

    至于数组中的键,我写的内容仅适用于该行的这一部分:Key1:Value1|Key2:Value2|Key3:Value3|...等 所以,为了增加对整个格式的支持,这里是修改:

    function create(line) {
        var parts = line.match(/^\(msg(\d+)\) \((.+)\)$/);
        var tokens = parts[2].split("|");
        var obj = { msgID: parts[1] };
        for (var i = 0; i < tokens.length; i++) {
            tokens[i] = tokens[i].split(":");
            obj[tokens[i][0]] = tokens[i][1];
        }
        return obj;
    }
    

    如果你把这个应用到你给出的例子中,你会得到这个:

    arr is: [{
        msgID: XXX,
        Key1: Value1,
        Key2: Value2,
        Key3: Value3
    }]
    

    希望这可以为您解决问题。

    【讨论】:

    • 优秀。这似乎可以满足我的一切需求——除了我不知道访问排序数组的正确语法。 arr 是否被排序输出替换,还是我需要为这个设置第二个数组? arr 中的第一个键似乎是行号,但是如何访问其他键?谢谢。皮特。
    • (和其他)。这有效:var obj = arr[i] ; for (var j in obj) { out += j + ": " + obj[j] + "\n&lt;br/&gt;"; },但明确指定键为obj[Key1] 没有。你能帮我理解为什么吗?
    • 当您使用此方法从对象获取属性时,您需要记住属性名称应该是(js)原语,即布尔值、数字、字符串等。以​​您的示例:obj["Key1"] 应该可以工作。当您使用 for each 循环遍历属性时,您会以正确的形式获得键,在您的情况下为字符串,等等: obj[j] 有效,因为 j是一个字符串。
    • 再次感谢尼赞。这很有意义。但不幸的是,它不起作用。我一定在某个地方犯了另一个错误,这影响了我的逻辑。谢谢。
    • 它应该可以工作,所以是的,也许你还有其他问题。另外,只是为了确保:它都是区分大小写的,所以 obj["key"]不同于 obj["Key"]
    猜你喜欢
    • 2013-08-02
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多