Перебрать массив объектов, суммировать элементы массива и поместить результат в последний элемент

У меня есть массив объектов следующим образом. Внутри каждого объекта есть массив P2.

let input = [ 
     { "P2": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P2": [ 5, 1, 0 ] },
]

Я хочу желаемого результата. как видите, я добавляю элементы и помещаю результат в последний элемент. например, добавив 6+6+0 и поместив результат в последний элемент как 12. Аналогично для других объектов внутри массива. Таким образом, окончательный результат будет выглядеть так.

   [ 
     { "P2": [ 6, 6, 0, 12 ] },
     { "P2": [ 3, 2, 0, 5 ] },
     { "P2": [ 5, 1, 0, 6 ] },
   ]

Я могу добиться этого с помощью простого цикла и функции сокращения, как показано ниже.

input.forEach(arrayItem => {
  let sum = arrayItem.P2.reduce((partialSum, a) => partialSum + a, 0);
  arrayItem.P2.push(sum)
});

console.info(input)

Пока здесь все в порядке. но становится действительно интересно, когда у меня есть динамический ввод. например, внутри для статических значений P2, у меня может быть что угодно еще. Например, ниже показаны два примера динамического ввода.

let input = [ 
     { "P1": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P3": [ 5, 1, 0 ] },
]

ИЛИ

let input = [ 
     { "P2": [ 3, 3, 3, 2 ] },
     { "P2": [ 7, 7, 7, 4 ] },
     { "Total": [ 5, 1, 4, 6 ] },
]

Может ли кто-нибудь сообщить мне, как изменить мой код, если есть такие динамические имена свойств.

?? Что такое «динамическая» часть?

Pointy 08.05.2024 17:46

названия свойств, p2 p3, total

Aren Trot 08.05.2024 17:47

Что ж, вы можете использовать Object.keys(), чтобы получить массив имен свойств, а затем перебирать его по своему усмотрению.

Pointy 08.05.2024 17:48

Если это всегда последний элемент массива, вы можете использовать input[input.length-1], чтобы получить последний элемент, и Object.keys(input[input.length-1])[0], чтобы получить его ключевое значение.

mykaf 08.05.2024 17:48

Вторая проблема на самом деле не так уж интересна, она больше похожа на то, что чей-то код полностью использует неправильную структуру данных для сбора данных: почему у них разные имена свойств, и можете ли вы исправить код, который вместо этого делает это? (Поскольку попытка компенсировать это позже просто накладывает повязку на и без того плохой выбор, давайте вместо этого исправим то, что пошло не так?)

Mike 'Pomax' Kamermans 08.05.2024 17:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
66
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

вы можете перебирать каждый объект в массиве и динамически получать доступ к имени свойства, используя Object.keys() или Object.entries().

let input = [ 
    { "P1": [ 6, 6, 0 ] },
    { "P2": [ 3, 2, 0 ] },
    { "P3": [ 5, 1, 0 ] },
];

input.forEach(arrayItem => {
    let propertyName = Object.keys(arrayItem)[0];
    let values = arrayItem[propertyName];
    let sum = values.reduce((partialSum, value) => partialSum + value, 0);
    values.push(sum);
});

console.info(input);

Используя ваш второй пример

let input = [ 
     { "P2": [ 3, 3, 3, 2 ] },
     { "P2": [ 7, 7, 7, 4 ] },
     { "Total": [ 5, 1, 4, 6 ] },
]

input.forEach(arrayItem => {
    let propertyName = Object.keys(arrayItem)[0];
    let values = arrayItem[propertyName];
    let sum = values.reduce((partialSum, value) => partialSum + value, 0);
    values.push(sum);
});

console.info(input);

Просто выполните итерацию и вставьте сумму в качестве последнего элемента в подмассивы:

let input = [ 
     { "P1": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P3": [ 5, 1, 0 ] },
]

input.forEach(item => {
  const [arr] = Object.values(item);
  arr.push(arr.reduce((r, n) => r+n));
});
console.info(input);

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

let input = [ 
     { "P2": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P2": [ 5, 1, 0 ] },
];

input = input.map(({P2}) => ({P2:[...P2,P2.reduce((a,c) => a+c,0)]}));

console.info( input );

Теперь для этого вы можете использовать метод карты массива и Object.keys() и Object.values():

let input = [ 
     { "P1": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P3": [ 5, 1, 0 ] },
];

input = input.map(o => ({
    [Object.keys(o)[0]]: [
        ...Object.values(o)[0],
        Object.values(o)[0].reduce((a,c) => a+c,0)
    ]})
);

console.info( input );

И аналогично для этого:

let input = [ 
     { "P2": [ 3, 3, 3, 2 ] },
     { "P2": [ 7, 7, 7, 4 ] },
     { "Total": [ 5, 1, 4, 6 ] },
];

input = input.map(o => ({
    [Object.keys(o)[0]]: [
        ...Object.values(o)[0],
        Object.values(o)[0].reduce((a,c) => a+c,0)
    ]})
);
        
        
console.info( input );

Или, если вы решите использовать Object.entries() и Object.fromEntries:

let input = [ 
     { "P2": [ 3, 3, 3, 2 ] },
     { "P2": [ 7, 7, 7, 4 ] },
     { "Total": [ 5, 1, 4, 6 ] },
];

input = input.map(o => Object.fromEntries(
        Object.entries(o).map(
            ([key,values]) => [
                key,
                [...values,values.reduce((a,c) => a+c,0)]
            ]
        )
    )
);
        
        
console.info( input );

Проблема с вашим кодом в том, что вы используете arrayItem.P2 в функции и ожидаете, что она получит доступ к каждому объекту внутри массива. Он будет работать только для «P2» и не будет работать для других клавиш, таких как «P1», «P3» и тому подобное. Поэтому вам нужно получить доступ к массиву без явного упоминания имен key. Для этого вы можете использовать метод Object.keys. В вашем случае вам следует использовать Object.keys(arrayItem) для доступа к массиву внутри объектов.

input.forEach((arrayItem) => {
  let key = Object.keys(arrayItem);
  const sum = arrayItem[key]
    .reduce((a, b) => {
      a += b;
      return a;
    });
  arrayItem[key].push(sum);
});

console.info(input)
<script>
  let input = [{
      "P1": [6, 6, 0]
    },
    {
      "P2": [3, 2, 0]
    },
    {
      "P3": [5, 1, 0]
    },
  ]
</script>

Другие вопросы по теме