我不是Javascript专家,我在尝试将我在这里和其他地方找到的关于多维数组和排序的各种金块粘在一起时遇到了问题,并且想知道是否有人可以帮助我完整的示例?
我已经设法达到这样的程度,即我可以通过Ajax读取数据来填充localStorage。
行的格式是......
(msgXXX)(Key1:Value1 | Key2:Value2 | Key3:Value3 | ...等)
,其中
(msgXXX)是localStorage密钥;和
(Key1:Value1 | Key2:Value2 | Key3:Value3 | ...等)是单个连接的localStorage数据字符串
我想要做的是将所有这些转换为多维数组,我可以应用各种类型。例如,其中一个Keys称为“Timestamp”,该值是一个整数,表示自Unix纪元以来的秒数。我想基于此Timestamp值对所有行进行排序(按降序排列 - 即最新的第一行)。现在,数据集只有600多行。
我很自在,我可以进行提取,切片和切块以从localStorage中获取数据,但我甚至不确定我的目标是填充数组然后设置排序
有人能指出我正确的方向吗?
答案 0 :(得分: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 | ... etc 因此,要添加对整个格式的支持,这里是修改:
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
}]
希望这能为你解决问题。