Объединение объектов JS с одинаковым ключом, значениями в массив

Вопрос: Я пытаюсь объединить объекты JS вместе, которые имеют один и тот же ключ. В этом случае ключ, который я планирую использовать, - это поле "время", а затем каждый раз, когда я хочу включить каждое "приложение" в качестве ключа, а "сумму" - в качестве его значения. Остальные поля я не планирую включать. Я пробовал несколько

Вопрос:

Я пытаюсь объединить объекты JS вместе, которые имеют один и тот же ключ. В этом случае ключ, который я планирую использовать, – это поле “время”, а затем каждый раз, когда я хочу включить каждое “приложение” в качестве ключа, а “сумму” – в качестве его значения. Остальные поля я не планирую включать.

Я пробовал несколько маршрутов, но все еще возникают проблемы, код ниже:

var data = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; const result = data.reduce(function (r, e) { return Object.keys(e).forEach(function (k) { if (!r[k]) r[k] = [].concat(e[k]) else r[k] = r[k].concat(e[k]) }), r }, {}) console.log(result)

Вот как я хочу, чтобы данные выводились:

[ { «time»: «00:06», «cloudmark-desktop»: 2970, «dns»: 519169 }, { «time»: «01:06», «cloudmark-desktop»: 999, «dns»: 999 } ]

Любая помощь приветствуется! Спасибо

Лучший ответ:

Вы использовали {} в методе Reduce вместо []. Попробуйте этот фрагмент для самого короткого метода, чтобы достигнуть этого.

var data = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; const result = data.reduce(function (r, e) { let val = r.find(({time}) => time === e.time) if (!val) { val = {} r.push(val) } val.time = e.time; val[e.app] = e.sum; return r; }, []); console.log(result)Ответ №1

Вот один из способов, хотя и немного некрасиво:

var output = {}; var data = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; for (var i = 0; i < data.length; i++) { var d = data[i]; if (output[d[«time»]]) { output[d[«time»]][d[«app»]] = d[«sum»]; } else { output[d[«time»]] = { time: d[«time»], [d[«app»]]: d[«sum»] } } } console.log(Object.values(output));Ответ №2

Если вы предпочитаете делать это без помощи таких библиотек, как lodash, вы можете сделать это следующим образом:

var data = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; const result = data.reduce((acc, value, key) => { const object = acc.find(item => item.time === value.time); if(object) { if (Number.isInteger(object[value.app])) { object[value.app] += value.sum } else { object[value.app] = value.sum } return acc; } acc.push({ time: value.time, [value.app]: value.sum }); return acc; }, []); console.log(result);Ответ №3const data = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; const formattedData = data.reduce((acc, a) => { const timeExists = acc.findIndex(b => a.time === b.time); if(timeExists > -1) { const copy = […acc]; copy[timeExists] = { …copy[timeExists], [a.app]: a.sum } return copy } else { return [ …acc, { time: a.time, [a.app]: a.sum } ] } }, []); console.log(formattedData);

Попробуй это. Вероятно, первая часть утверждения if заслуживает некоторой любви.

Ответ №4

Одно из возможных решений:

const data = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; const groupedDataByTime = data.reduce((accumulator, currentValue) => { if (!accumulator.hasOwnProperty(currentValue.time)) { accumulator[currentValue.time] = {}; } const mapByTime = accumulator[currentValue.time]; if (!mapByTime.hasOwnProperty(currentValue.app)) { mapByTime[currentValue.app] = 0; } mapByTime[currentValue.app] += parseInt(currentValue.sum, 10); return accumulator; }, {}); const result = Object.keys(groupedDataByTime).map(time => { return Object.assign({ time }, groupedDataByTime[time]); }); console.log(result);Ответ №5

Вот еще одно решение на чистом JavaScript, которое также легче читать и понимать:

var timesArray = []; var uniqueTimesArray = []; var result = []; var items = [ { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 2970, «events»: «2.9KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 519169, «events»: «507.0KiB», «time»: «00:06» }, { «eventdate»: 1561334400000, «app»: «cloudmark-desktop», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» }, { «eventdate»: 1561334400000, «app»: «dns», «sum»: 999, «events»: «507.0KiB», «time»: «01:06» } ]; function onlyUnique(value, index, self) { return self.indexOf(value) === index; } items.forEach(function(element) { timesArray.push(element.time); }); uniqueTimesArray = timesArray.filter( onlyUnique ); uniqueTimesArray.forEach(function(timeElement) { var resultItem = {}; var key = «time»; resultItem[key] = timeElement; items.forEach(function(item) { if(item.time == timeElement){ resultItem[item.app] = item.sum; } }); result.push(resultItem); }); console.log(result);

Оцените статью
Добавить комментарий