объединить значения в массив с одинаковым идентификатором для объекта JSON - PullRequest
0 голосов
/ 22 декабря 2018

после операции соединения я получаю объект JSON с дублирующимися значениями идентификаторов, как можно сопоставить их со свойством ассоциации с массивом с помощью javascript

{
    "id": 1,
    "name": "doc 1",
    "appointmentTime": "2018-12-28T00:00:43"
},

{
    "id": 2,
    "name": "doc 2",
    "appointmentTime": "2018-12-25T23:00:53"
},
{
    "id": 2,
    "name": "doc 2",
    "appointmentTime": "2018-12-26T23:00:02"
},
{
    "id": 3,
    "name": "doc3",
    "appointmentTime": null
},

Я хочу что-то подобное

{
    "id": 1,
    "name": "doc1",
    "appointmentTime": ["2018-12-28T00:00:43"]
},
{
        "id": 2,
        "name": "doc 2",
        "appointmentTime": ["2018-12-26T23:00:02","2018-12-26T23:00:02"]
    },
    {
        "id": 3,
        "name": "doc3",
        "appointmentTime": null
    },

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Я бы сделал это так:

    //lets say you got your jsonObj already in an Array like:
var myarray = [{
    "id": 1,
    "name": "doc 1",
    "appointmentTime": "2018-12-28T00:00:43"
  },
  {
    "id": 2,
    "name": "doc 2",
    "appointmentTime": "2018-12-25T23:00:53"
  },
  {
    "id": 2,
    "name": "doc 2",
    "appointmentTime": "2018-12-26T23:00:02"
  },
  {
    "id": 3,
    "name": "doc3",
    "appointmentTime": null
  }
];

//just loop through your data and combine it
for (var i = 0; i < myarray.length; i++) {
  //And loop again for duplicate data
  for (var j = i + 1; j < myarray.length; j++) {
    if (myarray[i].id == myarray[j].id) {
      var tmp = myarray[j].appointmentTime;
      myarray[j].appointmentTime = [];
      myarray[j].appointmentTime.push(tmp);
      myarray[j].appointmentTime.push(myarray[i].appointmentTime);

      myarray[i] = {};
    }
  }
}
console.log(myarray);

удалить после этого все пустые jsonobj

https://jsfiddle.net/m073qwr6/1/

0 голосов
/ 22 декабря 2018
> let mergeDuplicates = (arr, uniqueKey, mergeKey) => {
> let hashMap = {}; arr.forEach(item => {
> 
>     if(hashMap[item[uniqueKey]] == null) { item[mergeKey] = [item[mergeKey]]; hashMap[item[uniqueKey]] = item;  }
>     else { hashMap[item[uniqueKey]][mergeKey].push(item[mergeKey]); }

>     let ansArr = [];
>     for(var key in hashMap){
>        ansArr.push(hashMap[key]);
>     }
>     return ansArr;
> 
> })
>
> }
> myarray = mergeDuplicates(myarray, "id", "appointmentTime");
0 голосов
/ 22 декабря 2018

Для этого вам потребуется уменьшить :

const src = [{
    "id": 1,
    "name": "doc 1",
    "appointmentTime": "2018-12-28T00:00:43"
},

{
    "id": 2,
    "name": "doc 2",
    "appointmentTime": "2018-12-25T23:00:53"
},
{
    "id": 2,
    "name": "doc 2",
    "appointmentTime": "2018-12-26T23:00:02"
},
{
    "id": 3,
    "name": "doc3",
    "appointmentTime": null
}]

const result = src.reduce((acc, {id, name, appointmentTime}) => {
  const existing = acc.find(i => i.id === id)
  if (existing) { existing.appointmentTime.push(appointmentTime) } 
  else {acc.push({id, name, appointmentTime: [appointmentTime]})}
  
  return acc
}, [])

console.log(result)

Я также использовал деструктурирующее назначение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...