Node.js javascript: уменьшить массив объекта на несколько значений ключа

#javascript #node.js #arrays #filter

#javascript #node.js #массивы #Фильтр

Вопрос:

У меня есть следующий массив объектов в Node.js сценарий:

 [ 
{ 
    start: '10-05-2018',    
    assigned_agent: '1257434'
     },
  { 
    start: '10-05-2018',
    assigned_agent: '1257434'
    },
  { 
    start: '10-05-2018',
    assigned_agent: '1257434'
   },
  { 
    start: '10-06-2018',    
    assigned_agent: '1257434'
    },
  { 
    start: '10-05-2018',   
    assigned_agent: '1277852'
     },
  { 
    start: '10-05-2018',
    assigned_agent: '1277852'
  }
 ]
  

Что мне нужно, так это сгруппировать это по ключам start и assigned_agent . Я пробовал filter примеры функций, но безуспешно. Нет, в массиве есть другие пары ключ / значение, но для большей ясности их опускаем. Кроме того, хотя это Node.js сценарий У меня есть Lodash, если это поможет.

Спасибо.

Комментарии:

1. Вам нужен reduce метод, а не фильтр, если вы хотите их сгруппировать.

2. Спасибо. Тогда это должно быть простое решение.

3. Да, тот, с помощью которого вы должны быть в состоянии сделать попытку самостоятельно.

4. var arr_new = Object.values(obj_agents_routes.reduce((acc, cur) => Object.assign(acc, { [cur.assigned_agent, cur.start]: cur }), {}));

5. имеет неожиданную ошибку токена. Мне нужно выяснить «уменьшить» для нескольких значений.

Ответ №1:

Если вы согласны с использованием Lodash, попробуйте groupBy

 const data = [
  { start: "10-05-2018", assigned_agent: "1257434" },
  { start: "10-05-2018", assigned_agent: "1257434" },
  { start: "10-05-2018", assigned_agent: "1257434" },
  { start: "10-06-2018", assigned_agent: "1257434" },
  { start: "10-05-2018", assigned_agent: "1277852" },
  { start: "10-05-2018", assigned_agent: "1277852" },
]

const group_by_both = _.chain(data)
  .groupBy((el) => `${el.start} ${el.assigned_agent}`)
  .values()
  .value()

console.log(group_by_both)  
 .as-console-wrapper { max-height: 100% !important; }  
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>  

Комментарии:

1. Я согласен с Lodash, но мне нужно группировать по обоим значениям для каждой пары массивов. Позвольте мне попробовать ваше решение. Спасибо!

2. Привет, ваш ответ вроде как работает, но без необходимости добавляет: { ’10-05-2018 1257434′: [ {

3. @IrfanClemson вы могли бы избавиться от него, извлекая значение с помощью _.values()

4. Привет, пожалуйста, обновите свой ответ, и я приму его. Я думаю, что я почти на месте. Спасибо!

5. @IrfanClemson только что обновлен, вы могли бы взглянуть на него

Ответ №2:

 var data = [{
    start: '10-05-2018',
    assigned_agent: '1257434'
  },
  {
    start: '10-05-2018',
    assigned_agent: '1257434'
  },
  {
    start: '10-05-2018',
    assigned_agent: '1257434'
  },
  {
    start: '10-06-2018',
    assigned_agent: '1257434'
  },
  {
    start: '10-05-2018',
    assigned_agent: '1277852'
  },
  {
    start: '10-05-2018',
    assigned_agent: '1277852'
  }
];

var grouped = data.reduce((accumulator, element) => {
    // group by start and agent, so combine values for unique key
    var key = element.start   element.assigned_agent;
    
    // if there is not already a grouping, make an empty array
    accumulator[key] = accumulator[key] || [];
    
    // add the element to the desired group
    accumulator[key].push(element);
    
    // return the accumulator for the next iteration
    return accumulator;
}, {});

console.log(grouped);  

Комментарии:

1. Привет, спасибо за вашу помощь! Я уже начал с ответа @hgb123. Уверен, что ваши тоже помогли бы. Еще раз спасибо!