Я пытаюсь упростить массив с помощью Javascript
[{
{name: orange,
quanity: 1},
{name: apple,
quanity: 3}
}]
Я хочу
[{
orange:1,
apple: 3
}]
я пытался
const keys = flat.map(item => {
item.name = item.quanity
})
Но я получаю
[ undefined, undefined ]
Спасибо!
Я пытаюсь упростить большие наборы данных для создания диаграмм с помощью D3.
Ваш пример объекта синтаксически недействителен. У вас что-то типа [{ {}, {} }] Возможно, внешние { } опечатка?



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


Вы можете вернуть нужные пары ключ-значение в конечном объекте из обратного вызова map, а затем использовать Object.fromEntries для создания комбинированного объекта.
let arr=[{name:"orange",quanity:1},{name:"apple",quanity:3}];
let res = [Object.fromEntries(arr.map(o => [o.name, o.quanity]))];
console.info(res);Похожее, но немного другое решение по сравнению с решением от Unmigititiated. Оба хороши и короткие.
let original = [
{
name: 'orange',
quantity: 1
},
{
name: 'apple',
quantity: 3
}
];
let simpler = original
.map(item => ({ [item.name]: item.quantity }))
.reduce((a, c) => Object.assign(a, c), {});
console.info(simpler);а у этого другой формат?
Каким путем? Вы хотите сказать, что я исправил написание количества?
Нет, я имел в виду вместо одного объекта с несколькими реквизитами. это по-прежнему создает несколько объектов с одной опорой
о, вы совершенно правы... отредактирую...
но тогда массив не нужен? может это ошибка в вопросе?
@ThomasFrank LOL, спасибо, я исправил это :)
Я отредактировал свое решение - все еще довольно короткое, но не такое короткое, как Unmitigated. :) Все хорошо. Кто бы ни отредактировал мой ответ, чтобы он работал, «запустите фрагмент кода» - спасибо, я буду помнить, что теперь буду использовать их для таких вопросов.
зачем отображать, а потом уменьшать? просто уменьшить
Вы правы - это была бы одна из возможностей (здесь есть еще один ответ, который уже делает это. :) На самом деле я изначально неправильно понял вопрос, поскольку он был опубликован с массивом вокруг единственного объекта и создал несколько объектов, а затем просто быстро добавил редуктор исправить это... Так что не оптимально.
Примечание. Данные, указанные в вопросе, не являются допустимым синтаксисом JavaScript.
Входные данные, указанные в вопросе, представляют собой массив объектов, где каждый объект представляет собой фрукт и соответствующее ему количество. Чтобы преобразовать этот ввод в желаемый вывод, вы можете использовать следующий код:
const arr = [
{ name: "orange", quantity: 1 },
{ name: "apple", quantity: 3 }
];
const ans = {};
arr.forEach(({ name, quantity }) => {
ans[name] = quantity;
});
Этот код инициализирует пустой объект и затем перебирает каждый объект во входном массиве, используя метод forEach. Для каждого объекта он извлекает свойства имени и количества и добавляет их к объекту ans в виде пары ключ-значение.
Вот еще один способ, используя .reduce():
let original = [
{
name: 'orange',
quantity: 1
},
{
name: 'apple',
quantity: 3
}
];
let res = original.reduce((a,{name, quantity})=>(a[name]=quantity,a),{});
console.info(res);Ваша структура входных данных недействительна. Вам нужно удалить лишние фигурные скобки и указать строковые значения (и, возможно, правильно написать «количество»). Итак, у вас осталось:
const arr = [
{ name: 'orange', quantity: 1 },
{ name: 'apple', quantity: 3 }
];
Есть несколько способов получить желаемый результат, но, возможно, самый простой — использовать цикл for..of для перебора массива. Затем вы можете использовать значения name и quantity для заполнения ключей/значений свойств выходного объекта. Если вы хотите, чтобы этот объект был единственным элементом в массиве, вы можете обернуть объект позже.
Примечание: поскольку мы не знаем, уникальны ли имена объектов, я добавил к данным дополнительный объект, чтобы вы могли увидеть, как это добавление работает в этом примере.
const arr = [
{ name: 'orange', quantity: 1},
{ name: 'apple', quantity: 3},
{ name: 'orange', quantity: 32 }
];
// Empty object
const out = {};
// Iterate over the array.
for (const obj of arr) {
// Destructure the name/quantity propertied
// from each object
const { name, quantity } = obj;
// If the key identified by the name doesn't
// exist on the output object create it and
// set it to zero. This means that it doesn't matter
// if there is more than one object with the same name.
// If there are post-first object this line of
// code will be ignored.
out[name] ??= 0;
// Update the property value with the
// quantity value.
out[name] += quantity;
}
// Wrap the object in an array
// should you need to
console.info([out]);Дополнительная документация
почему вам нужен массив из 1 элемента вместо объекта. также ваш ввод не выглядит действительным. возможно
Object.fromEntries(arr.map(e => [e.name,e.quanity]))