javascript - 如何在js中JSON数组按相同元素重新排列成一个新的JSON,求大拿帮助,整了2天了还是没弄好。。

查看:489
本文介绍了javascript - 如何在js中JSON数组按相同元素重新排列成一个新的JSON,求大拿帮助,整了2天了还是没弄好。。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

请问大拿们,如何把json1优雅简便的重构成json2呢,具体就是想要把每个menuDate和dinnerTime同时相等的元素分为一组,重构一个json出来。可以使用jquery的。

json1:
[

{
    "menuDate": 1,
    "dinnerTime": "0",
    "num": 5
},
{
    "menuDate": 1,
    "dinnerTime": "0",
    "num": 1
},
{
    "menuDate": 1,
    "dinnerTime": "1",
    "num": 3
},
{
    "menuDate": 2,
    "dinnerTime": "0",
    "num": 3
},
{
    "menuDate": 2,
    "dinnerTime": "0",
    "num": 6
}

]

json2:
[

{
    "menuDate": 1,
    "dinnerTime": "0",
    "value": [
        {
            "menuDate": 1,
            "dinnerTime": "0",
            "num": 5
        },
        {
            "menuDate": 1,
            "dinnerTime": "0",
            "num": 1
        }
    ]
},
{
    "menuDate": 1,
    "dinnerTime": "1",
    "value": [
        {
            "menuDate": 1,
            "dinnerTime": "1",
            "num": 3
        }
    ]
},
{
    "menuDate": 2,
    "dinnerTime": "0",
    "value": [
        {
            "menuDate": 2,
            "dinnerTime": "0",
            "num": 3
        },
        {
            "menuDate": 2,
            "dinnerTime": "0",
            "num": 6
        }
    ]
}

]

解决方案

我先说说思路,首先json1 肯定需要遍历:

for (var i = 0; i < json1.length; i++) {
    var json1Elem = json1[i];
}

如上,假设现在遍历到json1 的第i个元素,如果json2 中没有找到与之相同的menudatedinnerTime,说明这是json1 第一次遇到这个两个值,就为json2 新增一个元素:

json2.push({
    "menuDate": json1Elem.menuDate,
    "dinnerTime": json1Elem.dinnerTime,
    "value": [json1Elem]
});

如果找到相同的呢?说明之前已经添加过了,假设json2 中这个相同的元素索引号为j,那么:

json2[j].value.push(json1Elem);

思路有了,现在要解决两个问题:

  1. 怎么判断json2 中是否存在某个元素与json1Elem 有相同的menudatedinnerTime

  2. 假设找到拥有相同的menudatedinnerTime的元素,这个元素的索引号j是多少呢?

我的做法是新建一个keyMap对象,menudatedinnerTime的值结合在一起作为keyMap的key,这个key是判断是否相同的唯一的依据;然后key的值是上面提到的j。整个例子的代码是:

var json2 = [];
var keyMap = {};
for (var i = 0; i < json1.length; i++) {
  var json1Elem = json1[i];
  var elemKey = json1Elem.menuDate + '-' + json1Elem.dinnerTime; // 用&或者_也可以
  if (elemKey in keyMap) {
    json2[keyMap[elemKey]].value.push(json1Elem);
  } else {
    
    json2.push({
      "menuDate": json1Elem.menuDate,
      "dinnerTime": json1Elem.dinnerTime,
      "value": [json1Elem]
    });
    keyMap[elemKey] = json2.length - 1;
  }
}

上面的代码中,elemKeymenudatedinnerTime的结合,如果这个键存在,说明之前已经添加过相同menudatedinnerTime的json1 元素了;
如果不存在,那就加一下;这里我把json2.length - 1的值赋给keyMap[elemKey],这个值正是j的值(刚刚push 进去),因此:

json2[keyMap[elemKey]].value.push(json1Elem);

就是

json2[j].value.push(json1Elem);

这篇关于javascript - 如何在js中JSON数组按相同元素重新排列成一个新的JSON,求大拿帮助,整了2天了还是没弄好。。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆