Объединить массив объектов по одному значению ключа - PullRequest
0 голосов
/ 31 августа 2018

У меня есть массив объектов, таких как:

[
  {
    "name": "Blah",
    "description": "This is a description"
  },
  {
    "name": "Foo",
    "description": "This is a description"
  },
  {
    "name": "Bar",
    "description": "This is a description"
  },
  {
    "name": "Blah",
    "description": "This is a description"
  },
  {
    "name": "Test",
    "description": "This is a description"
  }
]

Я бы хотел запустить какую-нибудь функцию для объединения объектов с одинаковыми именами в шаблоне description1 + "\n" + description2, поэтому конечный результат:

[
  {
    "name": "Foo",
    "description": "This is a description"
  },
  {
    "name": "Bar",
    "description": "This is a description"
  },
  {
    "name": "Blah",
    "description": "This is a description\nThis is a description"
  },
  {
    "name": "Test",
    "description": "This is a description"
  }
]

Порядок массива не нужно сохранять. Любая помощь будет оценена. Спасибо!

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Вы можете просто использовать Array.reduce() для создания карты, сгруппированной по имени, и Object.values() на карте даст желаемый результат:

let arr = [ { "name": "Blah", "description": "This is a description" }, { "name": "Foo", "description": "This is a description" }, { "name": "Bar", "description": "This is a description" }, { "name": "Blah", "description": "This is a description" }, { "name": "Test", "description": "This is a description" } ];
let result = Object.values(arr.reduce((a, {name,description})=>{
  if(a[name])
    a[name].description += "\n" + description;
   else
    a[name] = Object.assign({},{name,description});
   return a;
},{}));
console.log(result);
0 голосов
/ 31 августа 2018

Вы можете использовать redu и findIndex, чтобы проверить, есть ли в новом массиве какой-либо объект, имя которого совпадает. Если это так, то обновите описание

let orgArray = [{
    "name": "Blah",
    "description": "This is a description"
  },
  {
    "name": "Foo",
    "description": "This is a description"
  },
  {
    "name": "Bar",
    "description": "This is a description"
  },
  {
    "name": "Blah",
    "description": "This is a description"
  },
  {
    "name": "Test",
    "description": "This is a description"
  }
]

let newArray = orgArray.reduce(function(acc, curr) {
  let findIndexs = acc.findIndex(function(item) {
    return item.name === curr.name;

  })
  if (findIndexs === -1) {
    let obj = {
      name: curr.name,
      description: curr.description
    }
    acc.push(obj)
  } else {
    acc[findIndexs].description = acc[findIndexs].description + ' \n ' + curr.description
  }
  return acc;
}, []);
console.log(newArray)
0 голосов
/ 31 августа 2018

Вы можете использовать объект поиска, чтобы найти дубликаты:

 const result = [], hash = {};
 for(const {name, description} of input) {
    if(hash[name]) {
      hash[name].description += "\n" + description;
    } else {
      result.push(hash[name] = { name, description });
   }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...