У меня есть массив объектов следующим образом. Внутри каждого объекта есть массив 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 ] },
]
Может ли кто-нибудь сообщить мне, как изменить мой код, если есть такие динамические имена свойств.
названия свойств, p2 p3, total
Что ж, вы можете использовать Object.keys(), чтобы получить массив имен свойств, а затем перебирать его по своему усмотрению.
Если это всегда последний элемент массива, вы можете использовать input[input.length-1], чтобы получить последний элемент, и Object.keys(input[input.length-1])[0], чтобы получить его ключевое значение.
Вторая проблема на самом деле не так уж интересна, она больше похожа на то, что чей-то код полностью использует неправильную структуру данных для сбора данных: почему у них разные имена свойств, и можете ли вы исправить код, который вместо этого делает это? (Поскольку попытка компенсировать это позже просто накладывает повязку на и без того плохой выбор, давайте вместо этого исправим то, что пошло не так?)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вы можете перебирать каждый объект в массиве и динамически получать доступ к имени свойства, используя 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>
?? Что такое «динамическая» часть?