Как объединить массив свойств с помощью общего ключа

#javascript #underscore.js

#javascript #underscore.js

Вопрос:

Как добиться приведенного ниже результата, используя подчеркивание js?

Текущий результат:

 [
{Stats: "Number of virus", "Dec-2018": "1"},
{Stats: "Number of alerts", "Dec-2018": "2"},
{Stats: "Number of incidents", "Dec-2018": "1"},
{Stats: "Vulnerabilities", "Dec-2018": "6"},
{Stats: "Number of virus", "Nov-2018": "4"},
{Stats: "Number of alerts", "Nov-2018": "6"},
{Stats: "Number of incidents", "Nov-2018": "2"},
{Stats: "Vulnerabilities", "Nov-2018": "8"},
{Stats: "Number of virus", "Oct-2018": "2"},
{Stats: "Number of alerts", "Oct-2018": "2"},
{Stats: "Number of incidents", "Oct-2018": "5"},
{Stats: "Vulnerabilities", "Oct-2018": "2"},
]
  

Ожидаемый результат:

 [
{Stats: "Number of virus", Dec-2018: "1", "Nov-2018": "4", Oct-2018: "2"},
{Stats: "Number of alerts", Dec-2018: "2","Nov-2018": "6", Oct-2018: "2"},
{Stats: "Number of incidents", Dec-2018: "1", "Nov-2018": "2", Oct-2018: "5"},
{Stats: "Vulnerabilities", Dec-2018: "6", "Nov-2018": "8", Oct-2018: "2"}
]
  

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

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

Ответ №1:

Вы можете добиться этого с помощью следующей процедуры. Сначала создайте объект с уникальными Stats значениями, используя indexBy() функцию. После этого для каждого элемента данных расширьте тот, который имеет такое же Stats значение. Вот и все!

 var data = [
{Stats: "Number of virus", "Dec-2018": "1"},
{Stats: "Number of alerts", "Dec-2018": "2"},
{Stats: "Number of incidents", "Dec-2018": "1"},
{Stats: "Vulnerabilities", "Dec-2018": "6"},
{Stats: "Number of virus", "Nov-2018": "4"},
{Stats: "Number of alerts", "Nov-2018": "6"},
{Stats: "Number of incidents", "Nov-2018": "2"},
{Stats: "Vulnerabilities", "Nov-2018": "8"},
{Stats: "Number of virus", "Oct-2018": "2"},
{Stats: "Number of alerts", "Oct-2018": "2"},
{Stats: "Number of incidents", "Oct-2018": "5"},
{Stats: "Vulnerabilities", "Oct-2018": "2"},
]

var indexed = _.indexBy(data, 'Stats');

_.each(data, function(elem) {
  var object = indexed[elem.Stats];
  if (object) _.extend(object, elem);
});

var result = Object.values(indexed);

console.log(result);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>  

Ответ №2:

Вы могли бы использовать reduce и Object.values() вот так:

 let input=[{Stats:"Number of virus","Dec-2018":"1"},{Stats:"Number of alerts","Dec-2018":"2"},{Stats:"Number of incidents","Dec-2018":"1"},{Stats:"Vulnerabilities","Dec-2018":"6"},{Stats:"Number of virus","Nov-2018":"4"},{Stats:"Number of alerts","Nov-2018":"6"},{Stats:"Number of incidents","Nov-2018":"2"},{Stats:"Vulnerabilities","Nov-2018":"8"},{Stats:"Number of virus","Oct-2018":"2"},{Stats:"Number of alerts","Oct-2018":"2"},{Stats:"Number of incidents","Oct-2018":"5"},{Stats:"Vulnerabilities","Oct-2018":"2"}];

let merged = input.reduce((acc, o) => {
  acc[o.Stats] = { ...acc[o.Stats], ...o }
  return acc;
}, {})

console.log(Object.values(merged))  

Ответ №3:

вы могли бы использовать findIndex и reduce

 const data = [
{Stats: "Number of virus", "Dec-2018": "1"},
{Stats: "Number of alerts", "Dec-2018": "2"},
{Stats: "Number of incidents", "Dec-2018": "1"},
{Stats: "Vulnerabilities", "Dec-2018": "6"},
{Stats: "Number of virus", "Nov-2018": "4"},
{Stats: "Number of alerts", "Nov-2018": "6"},
{Stats: "Number of incidents", "Nov-2018": "2"},
{Stats: "Vulnerabilities", "Nov-2018": "8"},
{Stats: "Number of virus", "Oct-2018": "2"},
{Stats: "Number of alerts", "Oct-2018": "2"},
{Stats: "Number of incidents", "Oct-2018": "5"},
{Stats: "Vulnerabilities", "Oct-2018": "2"},
]

const res = data.reduce((all, {
  Stats,
  ...rest
}) => {

  let found = all.findIndex(o => Stats === o.Stats);

  if (found > -1 ) {
    all[found] = { ...all[found],
      ...rest
    }
  } else {
    all.push({ ...{
        Stats,
        ...rest
      }
    })

  }
  return all
}, [])

console.log(res)