真的很努力让我摆脱困境... 我正在尝试将项目从一个数组排序到另一个数组,但已归类。我的代码当前正在运行,但是麻烦的是我需要知道“ sort”数组的大小。目前,有四个条目与“数据”一起使用。将前两个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]不是函数”。这是因为排序数组中只有四个可用项目。
所以我只是想知道,有什么办法可以解决这个问题?如果数据数组总是在改变大小,并且添加了更多条目/类别,我是否必须继续手动调整排序数组的大小?
答案 0 :(得分: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; }
答案 1 :(得分:0)
使用 ES6 可以更简洁地实现此目的的另一种方法是,通过Array.reduce
在Array.sort
内部使用String.localeCompare
:
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
来获得所需的输出(多维数组)。