Массив объектов - рассчитать средние значения свойств? - PullRequest
0 голосов
/ 08 ноября 2018

Итак, у меня есть этот массив объектов

audioFeatures = [
    {danceability: 10, loudness: 2, instrumentalness: 4, energy: 5, acousticness: 7},
    {danceability: 6, loudness: 3, instrumentalness: 8, energy: 9, acousticness: 5},
    {danceability: 7, loudness: 5, instrumentalness: 6, energy: 2, acousticness: 5},
    {danceability: 8, loudness: 10, instrumentalness: 9, energy: 7, acousticness: 2},
]

И я хочу вычислить среднее значение для каждого свойства, то есть танцевальность должна = (10 + 6 + 7 + 8) / 4 и так далее.У меня это работает через множество циклов for, но это кажется действительно неэффективным, и в идеале я хочу в итоге получить один объект, содержащий каждое среднее значение, которое я не понял.

Кто-нибудь знает хороший способ сделать это?Я кодирую это в JavaScript, но любой совет будет оценен, и я могу попробовать реализовать его.Я пробовал карту, но не могу понять, как применить ее к этому (возможно, вложенная карта, лол, это, вероятно, не очень хорошая идея)

Ответы [ 3 ]

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

Вы можете добавить n th часть значения для средних значений путем итерации массива и пар ключ / значение объектов.

var audioFeatures = [{ danceability: 10, loudness: 2, instrumentalness: 4, energy: 5, acousticness: 7 }, { danceability: 6, loudness: 3, instrumentalness: 8, energy: 9, acousticness: 5 }, { danceability: 7, loudness: 5, instrumentalness: 6, energy: 2, acousticness: 5 }, { danceability: 8, loudness: 10, instrumentalness: 9, energy: 7, acousticness: 2 }],
    averages = audioFeatures.reduce((result, object, _, { length }) => {
        Object
            .entries(object)
            .forEach(([key, value]) => result[key] = (result[key] || 0) + value / length);
        return result;
    }, Object.create(null));
    
console.log(averages);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 08 ноября 2018

Попробуйте это:

var audioFeatures = [
	{danceability: 10, loudness: 2, instrumentalness: 4, energy: 5, acousticness: 7},
	{danceability: 6, loudness: 3, instrumentalness: 8, energy: 9, acousticness: 5},
	{danceability: 7, loudness: 5, instrumentalness: 6, energy: 2, acousticness: 5},
	{danceability: 8, loudness: 10, instrumentalness: 9, energy: 7, acousticness: 2},
];
var meanValues = [];
Object.keys(audioFeatures[0]).forEach(key => {
	console.log(key,
		meanValues[key] = (audioFeatures
			.map(a => a[key])
			.reduce((a, b) => a + b)
			/ audioFeatures.length));
});
  1. Найти все ключи .
  2. Для каждого ключа создайте карту (она вернет массив всех значений этого ключа)
  3. Получить сумму из массива, используя метод .reduce .
  4. разделите на длину массива и запишите его в переменную.
0 голосов
/ 08 ноября 2018

Вам просто нужно две петли:

audioFeatures = [
    {danceability: 10, loudness: 2, instrumentalness: 4, energy: 5, acousticness: 7},
    {danceability: 6, loudness: 3, instrumentalness: 8, energy: 9, acousticness: 5},
    {danceability: 7, loudness: 5, instrumentalness: 6, energy: 2, acousticness: 5},
    {danceability: 8, loudness: 10, instrumentalness: 9, energy: 7, acousticness: 2},
]

const average = {};

for (const feature of audioFeatures) {
  for (const [key, value] of Object.entries(feature)) {
    if (!average[key]) average[key] = 0;
    average[key] += value / audioFeatures.length;
  }
}

console.log(average);
...