Объединение элементов в массиве объектов на основе свойства - PullRequest
2 голосов
/ 06 марта 2020

У меня есть массив объектов. Каждый объект имеет свойство количества и значения. Если объект имеет такое же значение суммы, я бы хотел добавить это значение к этому объекту.

Вот пример массива:

const array = [
  {
    "key": 1,
    "amount": 11,
    "value": "were"
  },
  {
    "key": 2,
    "amount": 6,
    "value": "locomotives"
  },
  {
    "key": 3,
    "amount": 5,
    "value": "They"
  },
  {
    "key": 4,
    "amount": 5,
    "value": "with"
  },
  {
    "key": 5,
    "amount": 4,
    "value": "used"
  }
]

Я хотел бы преобразовать это так: 1006 *

const array = [
  {
    "key": 1,
    "amount": 11,
    "value": "were"
  },
  {
    "key": 2,
    "amount": 6,
    "value": "locomotives"
  },
  {
    "key": 3,
    "amount": 5,
    "value": "They, width"
  },
  {
    "key": 5,
    "amount": 4,
    "value": "used"
  }
]

Я пробовал reduce и map, но я не могу заставить его присоединиться,

Ответы [ 5 ]

1 голос
/ 06 марта 2020

Вы можете использовать .reduce() с ES6 Map путем индексации по значению amount. Если значение amount объекта уже существует на карте, вы можете обновить его value, чтобы включить текущие объекты value. Если значение amount отсутствует на карте, вы можете установить его в качестве ключа, а текущий объект - в качестве значения. Наконец, вы можете использовать Array.from(), чтобы получить массив значений объекта от итератора, возвращенного .values()

const array = [ { "key": 1, "amount": 11, "value": "were" }, { "key": 2, "amount": 6, "value": "locomotives" }, { "key": 3, "amount": 5, "value": "They" }, { "key": 4, "amount": 5, "value": "with" }, { "key": 5, "amount": 4, "value": "used" } ];

const res = Array.from(array.reduce((m, o) => {
  const curr = m.get(o.amount);
  return m.set(o.amount, curr && {...curr, value: `${curr.value}, ${o.value}`} || o);
}, new Map).values());
console.log(res);
1 голос
/ 06 марта 2020

Я думаю, что должно работать с .reduce():

const array = [
  {
    "key": 1,
    "amount": 11,
    "value": "were"
  },
  {
    "key": 2,
    "amount": 6,
    "value": "locomotives"
  },
  {
    "key": 3,
    "amount": 5,
    "value": "They"
  },
  {
    "key": 4,
    "amount": 5,
    "value": "with"
  },
  {
    "key": 5,
    "amount": 4,
    "value": "used"
  }
];

const result = array.reduce((a, c) => {
  const found = a.find(e => e.amount === c.amount);  
  if (found) found.value = `${found.value}, ${c.value}`;
  return found ? a : a.concat(c);
}, []);

console.log(result);

Надеюсь, это поможет!

0 голосов
/ 06 марта 2020

Используйте forEach l oop и постройте объект. Если ключ amount уже существует, добавьте строку значения.

const update = data => {
  const res = {};
  data.forEach(item => {
    res[item.amount] =
      item.amount in res
        ? {
            ...res[item.amount],
            value: `${res[item.amount].value}, ${item.value}`
          }
        : { ...item };
  });
  return Object.values(res);
};

const array = [
  {
    key: 1,
    amount: 11,
    value: "were"
  },
  {
    key: 2,
    amount: 6,
    value: "locomotives"
  },
  {
    key: 3,
    amount: 5,
    value: "They"
  },
  {
    key: 4,
    amount: 5,
    value: "with"
  },
  {
    key: 5,
    amount: 4,
    value: "used"
  }
];

console.log(update(array));
0 голосов
/ 06 марта 2020

В каждой итерации метода reduce мы можем добавить value, если есть уже добавленное value:

const result = array.reduce((a, c) => {
  a[c.amount] = a[c.amount] || c;
  if ((Object.keys(a).includes(c.amount.toString())) && (a[c.amount].value!= c.value))
      a[c.amount].value += ', ' + c.value;
  return a;
}, {});

Пример:

const array = [
  {
    "key": 1,
    "amount": 11,
    "value": "were"
  },
  {
    "key": 2,
    "amount": 6,
    "value": "locomotives"
  },
  {
    "key": 3,
    "amount": 5,
    "value": "They"
  },
  {
    "key": 4,
    "amount": 5,
    "value": "with"
  },
  {
    "key": 5,
    "amount": 4,
    "value": "used"
  }
];

const result = array.reduce((a, c) => {
  a[c.amount] = a[c.amount] || c;
  if ((Object.keys(a).includes(c.amount.toString())) && (a[c.amount].value!= c.value))
      a[c.amount].value += ', ' + c.value;
  return a;
}, {});

console.log(result);
0 голосов
/ 06 марта 2020

мой ..

const array1 = 
      [ { key: 1, amount: 11, value: "were"        } 
      , { key: 2, amount:  6, value: "locomotives" } 
      , { key: 3, amount:  5, value: "They"        } 
      , { key: 4, amount:  5, value: "with"        } 
      , { key: 5, amount:  4, value: "used"        } 
      ] 


const array2 = array1.reduce((a,c)=>
                {
                let same = a.find(e=>e.amount===c.amount)
                if (same) same.value += ', '+c.value
                else a.push(c)
                return a
                },[])

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