我一直在修补一个问题,我有一些JSON数据,我想根据对象的“名称”值的第一个字母对对象进行分组。
我能够通过数组排序函数来完成这个任务。但我也在努力完成一件事,那就是让任何以数字(或任何非字母值)开头的项目都应该分组成一个单独的组。
现在,一切都是按字母和编号分组的。
下面是一些JSON示例:
[{
"Id": 83107,
"Name": "10-11",
},
{
"Id": 83107,
"Name": "Bill",
},
{
"Id": 83107,
"Name": "Jim",
},
{
"Id": 83107,
"Name": "7-11",
},
{
"Id": 83107,
"Name": "Walgreens",
},
{
"Id": 83107,
"Name": "Apple",
},
}]
下面是我得到的输出:
{
"1":[
{
"Id":83107,
"Name":"10-11"
}
],
"7":[
{
"Id":83107,
"Name":"7-11"
}
],
"A":[
{
"Id":83107,
"Name":"Apple"
}
],
"B":[
{
"Id":83107,
"Name":"Bill"
}
],
"J":[
{
"Id":83107,
"Name":"Jim"
}
],
"W":[
{
"Id":83107,
"Name":"Walgreens"
}
]
}
我想做的是把所有的非字母表值放到他们自己的组中,这样他们就都属于一个名为“#”的组。
下面是我目前使用的还原函数:
var dataJSON = [{
"Id": 83107,
"Name": "10-11",
},
{
"Id": 83107,
"Name": "Bill",
},
{
"Id": 83107,
"Name": "Jim",
},
{
"Id": 83107,
"Name": "7-11",
},
{
"Id": 83107,
"Name": "Walgreens",
},
{
"Id": 83107,
"Name": "Apple",
},
}];
dataJSON.sort(function(a, b) {
return a.Name[0].localeCompare(b.Name[0]);
});
var result = {};
for (var i = 0; i < dataJSON.length; i++) {
var c = dataJSON[i].Name[0].toUpperCase();
if (result[c] && result[c].length >= 0)
result[c].push(dataJSON[i]);
else {
result[c] = [];
result[c].push(dataJSON[i]);
}
}
console.log(result);
发布于 2020-02-14 22:06:18
您只需修改代码以检查名称的第一个字母是否为数字,然后将其添加到排序数据中的#
组中。
您的代码应该如下所示
for (var i = 0; i < dataJSON.length; i++) {
var c = dataJSON[i].Name[0];
if(isNaN(parseInt(c))){
if (result[c] && result[c].length >= 0){
result[c].push(dataJSON[i]);
} else {
result[c] = [dataJSON[i]];
}
} else {
if(result['#'] && result['#'].length >= 0){
result['#'].push(dataJSON[i]);
} else {
result['#'] = [dataJSON[i]];
}
}
}
备注
这将导致result
拥有#
键,但在该键中,项目将按数字的第一个数字进行排序。因此,键Name
为"10-11"
的对象将位于键Name
为"7-11"
的对象之前。
使用您的dataJSON
运行我的代码将给出以下result
{
"#" : [
{
"Id": 83107,
"Name": "10-11"
},
{
"Id": 83107,
"Name": "7-11"
}
],
"A" : [
{
"Id":83107,
"Name":"Apple"
}
],
"B" : [
{
"Id":83107,
"Name":"Bill"
}
],
"J" : [
{
"Id":83107,
"Name":"Jim"
}
],
"W" : [
{
"Id":83107,
"Name":"Walgreens"
}
]
}
https://stackoverflow.com/questions/60233987
复制相似问题