Javascript Преобразование массива для сопоставления ключей со свойством массива и сохранение соответствующих значений дубликатов ключей в виде массива - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть массив, который имеет несколько объектов, и один из свойств объекта может иметь dupes, а именно.Учетная запись.Теперь я хочу преобразовать этот массив в карту с ключом, имеющим значение свойства Account, и соответствующие дубликаты должны быть сохранены в виде массива с этим ключом на карте.

let arr = [];
arr.push({'Key':'1','Record':{'Account':'a','data':'A1'}});
arr.push({'Key':'2','Record':{'Account':'b','data':'123'}});
arr.push({'Key':'3','Record':{'Account':'a','data':'A2'}});
arr.push({'Key':'4','Record':{'Account':'a','data':'A3'}});
arr.push({'Key':'5','Record':{'Account':'c','data':'123'}});
const  accIdMap=  arr.reduce((map,obj) => (map[obj.Record.Account] = obj,map), {});
console.log(arr);
console.log(accIdMap);

Итак, на данный момент accIdMap просто получает однозначное сопоставление значения ключа, которое является последним нажатием в массиве, т.е. 4, но я хочу, чтобы выходная картаиметь значение в виде массива, где когда-либо дублировались ключи.Я пробовал сокращение, но это устраняет дублирующиеся значения, но я хочу, чтобы дублирующиеся значения представляли собой соответствующий массив.

Например

Как вывод

{
  "a": {
    "Key": "4",
    "Record": {
      "Account": "a",
      "data": "A3"
    }
  },
  "b": {
    "Key": "2",
    "Record": {
      "Account": "b",
      "data": "123"
    }
  },
  "c": {
    "Key": "5",
    "Record": {
      "Account": "c",
      "data": "123"
    }
  }
}

Desired OutPut (ключи, которые были продублированы, должны иметь значения, добавленные как массив)

{
  "a": [{"Key": "4","Record": {"Account": "a","data": "A3"}},{
    "Key": "3",
    "Record": {
      "Account": "a",
      "data": "A2"
    }
  },{
    "Key": "1",
    "Record": {
      "Account": "a",
      "data": "A1"
    }
  }],
  "b": {
    "Key": "2",
    "Record": {
      "Account": "b",
      "data": "123"
    }
  },
  "c": {
    "Key": "5",
    "Record": {
      "Account": "c",
      "data": "123"
    }
  }
}

Ответы [ 3 ]

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

Вы можете использовать reduce следующим образом:

Проверьте, есть ли у accumulator ключ с током a.Record.Account.Если да, вставьте текущий элемент в контекст к нему.Иначе, добавьте a.Record.Account в качестве ключа и затем добавьте элемент к нему.

const input = [{'Key':'1','Record':{'Account':'a','data':'A1'}},
{'Key':'2','Record':{'Account':'b','data':'123'}},
{'Key':'3','Record':{'Account':'a','data':'A2'}},
{'Key':'4','Record':{'Account':'a','data':'A3'}},
{'Key':'5','Record':{'Account':'c','data':'123'}}]

const output = input.reduce((acc, a) => 
      ((acc[a.Record.Account] = acc[a.Record.Account] || []).push(a), acc), {})
console.log(output);
0 голосов
/ 26 декабря 2018

Это работает так, как вы ожидали.возьмите этот результат и сопоставьте его с желаемым результатом.

let arr = [];
arr.push({ 'Key': '1', 'Record': { 'Account': 'a', 'data': 'A1' } });
arr.push({ 'Key': '2', 'Record': { 'Account': 'b', 'data': '123' } });
arr.push({ 'Key': '3', 'Record': { 'Account': 'a', 'data': 'A2' } });
arr.push({ 'Key': '4', 'Record': { 'Account': 'a', 'data': 'A3' } });
arr.push({ 'Key': '5', 'Record': { 'Account': 'c', 'data': '123' } });
var obj = {}
arr.map((e) => {
    var filteredArr = arr.filter((f) => f.Record.Account == e.Record.Account)
    if (filteredArr.length > 1)
        obj[e.Record.Account] = filteredArr
    else if (filteredArr.length != 0)
        obj[e.Record.Account] = filteredArr[0]
})
console.log(JSON.stringify(obj))
0 голосов
/ 26 декабря 2018

Проверка в функции уменьшения, если значение уже существует, на основании этого вы можете сделать следующее.Если Учетная запись уже существует, проверьте, есть ли у карты массив ключей этой Учетной записи.Если нет, создайте массив с существующим и текущим элементом, создав пустой массив и нажав на него.Если это массив, просто нажмите на него.Если ключ учетной записи не существует, просто установите значение в качестве объекта.

Обновление : изменение порядка инициализации const m и добавление комментария к коду.

let arr = [];
arr.push({'Key':'1','Record':{'Account':'a','data':'A1'}});
arr.push({'Key':'2','Record':{'Account':'b','data':'123'}});
arr.push({'Key':'3','Record':{'Account':'a','data':'A2'}});
arr.push({'Key':'4','Record':{'Account':'a','data':'A3'}});
arr.push({'Key':'5','Record':{'Account':'c','data':'123'}});
const  accIdMap=  arr.reduce((map,obj) => {
    if(map[obj.Record.Account]) { // the property exists and can be an array or the obj
        if(!map[obj.Record.Account].length) { // means just the object. Creating an array then pushing the existing obj to it
            const m = (map[obj.Record.Account]);
            map[obj.Record.Account] = [];
            map[obj.Record.Account].push(m);
        }
        map[obj.Record.Account].push(obj); // if it was an array this will push it to the existing array. If it wasn't the previous if have created and inserted old value and this line pushes to the new array
    } else {
        map[obj.Record.Account] = obj; // just putting the obj value as it wasn't a duplicate
    }
    return map;
}, {});
console.log(arr);
console.log(accIdMap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...