Группировать массив элементов по одному значению - PullRequest
0 голосов
/ 30 апреля 2020

Привет У меня есть массив, как показано ниже:

мой массив:

[
  {
    "Id": 72,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "green-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
  {
    "Id": 71,
    "PropertyId": 58,
    "folderName": "test1",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "red-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
   {
    "Id": 70,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "orange-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  }
]

, если имя папки совпадает, я хочу сгруппировать в одну и добавить данные двух общих папок supportDocs в SupportDocs массив, поэтому я хочу вывод, как это :

[
  {
    "Id": 72,
    "PropertyId": 58,
    "folderName": "test1",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "green-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
  {
    "Id": 71,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "red-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      },{
        "FilePath": "path",
        "FileName": "orange-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  }

]

Я пытался использовать indexOf, но не работает Любое решение для группировки массива, если foldername то же самое

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Есть много способов решить эту проблему. Вот пример, который использует Array.reduce():

const result = data.reduce((acc, curr) => {  
  const existing = acc.find(e => e.folderName == curr.folderName);
  if (existing) {
    existing.supportingDocs = existing.supportingDocs.concat(curr.supportingDocs);
  } else {
    acc.push(curr);
  }
  return acc;
}, []);

В моем коде я также использую Array.find(), Array.concat() и Array.push().

Пожалуйста, ознакомьтесь с приведенным ниже фрагментом кода.

const data = [
  {
    "Id": 72,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "green-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
  {
    "Id": 71,
    "PropertyId": 58,
    "folderName": "test1",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "red-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
   {
    "Id": 70,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "orange-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  }
]

const result = data.reduce((acc, curr) => {  
  const existing = acc.find(e => e.folderName == curr.folderName);
  if (existing) {
    existing.supportingDocs = existing.supportingDocs.concat(curr.supportingDocs);
  } else {
    acc.push(curr);
  }
  return acc;
}, []);

console.log(result);
0 голосов
/ 30 апреля 2020

Дурацкий путь:

let origin = [
  {
    "Id": 72,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "green-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
  {
    "Id": 71,
    "PropertyId": 58,
    "folderName": "test1",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "red-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  },
   {
    "Id": 70,
    "PropertyId": 58,
    "folderName": "test2",
    "supportingDocs": [
      {
        "FilePath": "path",
        "FileName": "orange-logo.png",
        "UploadedDate": "2020-04-29T15:00:41.423"
      }
    ]
  }
];

let temp = [];
let output = [];
for( key in origin ) {
  let each = origin[key];
  let folderName = each["folderName"];
  
  if(temp.includes(folderName)){
    // if the foldername already exist.
    for ( i in output ){
      if(getKeyByValue(output[i], folderName) != undefined){
        output[i]["supportingDocs"].push(each["supportingDocs"][0]);
      }
    }
  } else {
    // if the foldername not exist    
    temp.push(folderName);
    output.push(each);
  }
}

console.log(output);

// find object key by value, not recursive.
function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...