2015-01-06 4 views
0

У меня есть объект JSON, который повторяющий по электронной почте свойства следующим образом:группы и объединить свойства JSON

accounts": [ 
{ 
    "email": "[email protected]", 
    "accountID": 1, 
    "accountName": "Account Name", 
    "permission": "Permission 1", 
    "nodeID": 1 
}, 
{ 
    "email": "[email protected]", 
    "accountID": 1, 
    "accountName": "Account Name", 
    "permission": "Permission 2", 
    "nodeID": 2 
}] 

Это JSON содержит повторяющиеся поля электронной почты, которые я хочу группе. Нужный в результате JSON выглядит следующим образом:

{ 
    “email” : ”[email protected]”, 
    “accountID” : 1, 
    “accountName” : “Account Name”, 
    “permissions” : [ 
    { 
     “permission” : “Permission 1”, 
     “nodeID” : 1 
    }, 
    { 
     “permission” : “Permission 2”, 
     “nodeID” : 2 
    } 
    ] 
} 

Итак, таким образом, в результате JSON не будет содержать более чем на 1 пункт с тем же свойством электронной почты.

Есть ли способ, которым это может быть достигнуто с помощью jQuery?

Заранее спасибо.

+1

Что вы пробовали? Я думаю, '.extend()' может быть тем, что вы ищете http://api.jquery.com/jquery.extend/ – ochi

+1

Речь идет о манипулировании данными в JavaScript; «с jQuery» не нужно. – Jacob

+0

Ну, я не пытаюсь объединить 2 объекта, а скорее группу по свойству и объединить другие свойства. – cycero

ответ

1

Это можно сделать довольно легко с forEach цикла:

var source = {accounts: [ 
 
{ 
 
    "email": "[email protected]", 
 
    "accountID": 1, 
 
    "accountName": "Account Name", 
 
    "permission": "Permission 1", 
 
    "nodeID": 1 
 
}, 
 
{ 
 
    "email": "[email protected]", 
 
    "accountID": 1, 
 
    "accountName": "Account Name", 
 
    "permission": "Permission 2", 
 
    "nodeID": 2 
 
}]}; 
 

 
var groups = {}; 
 

 
source.accounts.forEach(function(item) { 
 
    if (!groups.hasOwnProperty(item.email)) { 
 
     groups[item.email] = { 
 
      email : item.email, 
 
      accountID : item.accountID, 
 
      accountName: item.accountName, 
 
      permissions: [] 
 
     }; 
 
    } 
 
    groups[item.email].permissions.push({ 
 
     permission: item.permission, 
 
     nodeID: item.nodeID 
 
    }); 
 
}); 
 

 
alert(JSON.stringify(groups));

Мы создаем пустой объект, а затем мы пройдёмся по исходному массиву. Для каждого элемента массива мы проверяем, есть ли у нас это письмо уже, а если нет, мы вставляем его в объект вместе с accountID и accountName, и мы создаем пустой массив для разрешений. Затем мы просто добавляем разрешения к массиву.

Вы будете в конечном итоге с объектом, который выглядит примерно так:

{ 
    "[email protected]": { 
     "email": "[email protected]", 
     "accountID": 1, 
     "accountName": "Account Name", 
     "permissions": [ 
      { 
       "permission": "Permission 1", 
       "nodeID": 1 
      }, 
      { 
       "permission": "Permission 2", 
       "nodeID": 2 
      } 
     ] 
    } 
} 

С ключа для каждого сообщения электронной почты. Вы можете выполнить цикл с помощью цикла for...in, если вам нужно.

+0

Спасибо, Мэтт! – cycero

Смежные вопросы