Карта массивов JS, ключ groupBy - PullRequest
0 голосов
/ 01 марта 2019

Кто-нибудь знает чистое решение для преобразования из:

    var foo1 = [
    {
    "value":"1",
    "key":"abc"
  },
  {
    "value":"2",
    "key":"abc"
  },
  {
    "value":"3",
    "key":"def"
  }
];

в

var foo2 = [
  {
    "value":["1","2"],
    "key":"abc"
  },
  {
    "value":"3",
    "key":"def"
  }
];
  • Похоже, что ваш пост в основном код;пожалуйста, добавьте еще некоторые детали.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете сгруппировать элементы с помощью Map, а затем построить новый объект для набора результатов.

var array = [{ value: "1", key: "abc" }, { value: "2", key: "abc" }, { value: "3", key: "def" }],
    grouped = Array.from(
        array.reduce((m, { key, value }) => m.set(key, [...(m.get(key) || []), value]), new Map),
        ([key, value]) => ({ key, value })
    );

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 01 марта 2019

Вы можете использовать массив reduce & findIndex.acc - массив аккумуляторов.В массиве аккумуляторов используйте findIndex, чтобы увидеть, существует ли объект с таким же ключом.Если он существует, обновите значение объекта или добавьте новый объект в массив аккумуляторов с необходимыми параметрами

var foo1 = [{
    "value": "1",
    "key": "abc"
  },
  {
    "value": "2",
    "key": "abc"
  },
  {
    "value": "3",
    "key": "def"
  }
];


let groupedBy = foo1.reduce(function(acc, curr) {
  let ifHasKey = acc.findIndex(function(item) {
    return item.key === curr.key;
  })

  if (ifHasKey === -1) {
    acc.push({
      value: [curr.value],
      key: curr.key
    })
  } else {
    acc[ifHasKey].value.push(curr.value)

  }

  return acc;


}, []);
console.log(groupedBy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...