首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当将对象的JSON数组按值中的第一个字符分组时,我如何将以数字开头的所有字符分组到同一个组中?

当将对象的JSON数组按值中的第一个字符分组时,我如何将以数字开头的所有字符分组到同一个组中?
EN

Stack Overflow用户
提问于 2020-02-14 21:51:37
回答 1查看 373关注 0票数 0

我一直在修补一个问题,我有一些JSON数据,我想根据对象的“名称”值的第一个字母对对象进行分组。

我能够通过数组排序函数来完成这个任务。但我也在努力完成一件事,那就是让任何以数字(或任何非字母值)开头的项目都应该分组成一个单独的组。

现在,一切都是按字母编号分组的。

下面是一些JSON示例:

代码语言:javascript
运行
复制
[{
    "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",
},
}]

下面是我得到的输出:

代码语言:javascript
运行
复制
{
   "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"
      }
   ]
}

我想做的是把所有的非字母表值放到他们自己的组中,这样他们就都属于一个名为“#”的组。

下面是我目前使用的还原函数:

代码语言:javascript
运行
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-14 22:06:18

您只需修改代码以检查名称的第一个字母是否为数字,然后将其添加到排序数据中的#组中。

您的代码应该如下所示

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
{
  "#" : [
    {
      "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"
    }
   ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60233987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档