Изменить ключ объекта с одним атрибутом из его значений - PullRequest
0 голосов
/ 27 ноября 2018

Имея массив объектов с такой структурой:

[
    {
        key: id,
        value: id, name, type
    },
    {   key: id,
        value: id, name, type
    },
    {   key: id,
        value: id, name, type
    }
];

Используемый ключ - это идентификатор.Может быть больше групп значений для одного и того же идентификатора, например:

{ 132: Array(1), 243: Array(1), 389: Array(3)}
    132: Array(1)
        0: eqKey: "abc", id: 132, name: "name1"
    243: Array(1)
        0: eqKey: "ccc", id: 243, name: "name2"
    389: Array(3)
        0: eqKey: "vcv", id: 389, name: "name3"
        1: eqKey: "tre", id: 389, name: "name4"
        2: eqKey: "ace", id: 389, name: "name5"

Мой вопрос заключается в том, если это способ «перегруппировать» структуру, а не группировать по идентификатору для группировки по типу.(Тип уникален)

Таким образом, окончательная форма для приведенного выше примера будет выглядеть следующим образом:

{"abc": Ar(1), "ccc": Ar(1), "vcv": Ar(1), "tre": Ar(1), "ace": Ar(1)}  
    "abc": Array(1)
        0: eqKey: "abc", id: 132, name: "name1" 
    "ccc": Array(1)
        0: eqKey: "ccc", id: 243, name: "name2"
    "vcv": Array(1)
        0: eqKey: "vcv", id: 389, name: "name3"
    "tre": Array(1)
        0: eqKey: "tre", id: 389, name: "name4"
    "ace": Array(1)
        0: eqKey: "ace", id: 389, name: "name5"

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

Вы можете использовать два вложенных сокращения для внешних значений объекта и внутреннего массива.

var data = { 132: [{ eqKey: "abc", id: 132, name: "name1" }], 243: [{ eqKey: "ccc", id: 243, name: "name2" }], 389: [{ eqKey: "vcv", id: 389, name: "name3" }, { eqKey: "tre", id: 389, name: "name4" }, { eqKey: "ace", id: 389, name: "name5" }] },
    grouped = Object
        .values(data)
        .reduce(
            (r, a) => a.reduce(
                (s, o) => ((r[o.eqKey] = r[o.eqKey] || []).push(o), s),
                r
            ),
            {}
        );

console.log(grouped);
0 голосов
/ 27 ноября 2018

Вы можете использовать reduce для цикла по массиву.Конвертируйте каждый объект с помощью Object.values в массив и используйте forEach для циклического преобразования преобразованного массива

const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];

const result = arr.reduce((c, v) => {
  Object.values(v).forEach(o => c.push({[o.type]: o}))
  return c;
}, []);

console.log( result );

В новых браузерах (или с использованием профилировщика) вы можете использовать flatMap

const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];

const result = arr.flatMap(o => Object.values(o).map(v => ({[v.type]: v})))

console.log(result);
0 голосов
/ 27 ноября 2018

Вы можете выполнить ваши требования, используя reduce метод .

Метод Reduce () выполняет функцию редуктора (которую вы предоставляете) для каждого члена массива, получая в результатев одном выходном значении.

const data = [{
    id: 1,
    name: "name1",
    type: "xx"
  },{
    id: 2,
    name: "name2",
    type: "xy"
  },{
    id: 5,
    name: "name5",
    type: "vc"
  },{
    id: 5,
    name: "name6",
    type: "fg"
  }, {
    id: 5,
    name: "name7",
    type: "ae"
  }
];

const result = data.reduce(function(r, a) {
  r[a.type] = r[a.type] || [];
  r[a.type].push(a);
  return r;
}, Object.create(null));

console.log(result);
0 голосов
/ 27 ноября 2018

Как указано в комментариях, ваш второй фрагмент кода невозможен в JS.У объектов должны быть уникальные ключи.

Однако я верю, что вы пытаетесь достичь этого:

const array = [
  {
    1: { id: 1, name: 'name', type: 'ab' }
  },
  {
    5: { id: 5, name: 'name', type: 'aa' },
    4: { id: 4, name: 'name', type: 'ac' }
  }
];

const result = array
  .reduce((arr, item) => Object
    .keys(item)
    .reduce((arr2, key) => ([...arr2, { [item[key].type]: item[key] }]), arr), []);

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