Преобразование вложенного массива в объект
Я пытаюсь использовать reduce
для преобразования вложенного массива в объект.
Я хочу, чтобы преобразовать var bookprice = [["book1", ""], ["book2", ""], ["book3", ""]];
to
var bookpriceObj = {
"book1": "",
"book2": "",
"book3": ""
};
вот что я пробовал
var bookprice = [["book1", ""], ["book2", ""], ["book3", ""]];
bookpriceObj = {};
bookprice.reduce(function(a, cv, ci, arr){
for (var i = 0; i < arr.length; ++i)
bookpriceObj [i] = arr[i];
return bookpriceObj ;
})
но приведенный ниже результат не является желаемым результатом
{
["book1", ""]
["book2", ""]
["book3", ""]
}
7 ответов
использование forEach короче
var bookprice = [["book1", ""], ["book2", ""], ["book3", ""]];
var bookpriceObj = {};
bookprice.forEach(e=>bookpriceObj[e[0]] = e[1]);
console.log(bookpriceObj)
вы можете использовать reduce с Деструкторингом массива.
bookpriceObj = bookprice.reduce((a, [b, c]) => (a[b] = c, a), {});
вот что происходит:
-
a
- аккумулятор, который имеет начальное значение конечного параметра, переданного вreduce
. Последнее значение мы передаем это{}
Итак, это объект - Array Destructoring может немедленно назначить значения в массиве переменным. а.е.
[a, b] = ["one", "two"]
назначаетa
стоимостью"one"
иb
со значением"two"
- С каждой итерацией над каждым элементом мы присваиваем значение
b
(a.e. "book1" ) как свойство объекта (a
) и присвойте ему значение, равноеc
(а.е. "$2") - каждая итерация
reduce
вы должны вернуть аккумулятора(a
) - когда все это, наконец, будет сделано, он будет хранить в
bookpriceObj
результат!
var bookprice = [ ["book1", ""], ["book2", ""], ["book3", ""]],
bookpriceObj = bookprice.reduce((a, [b, c]) => (a[b] = c, a), {});
console.log(bookpriceObj)
вам нужно вернуть объект из "редуктора", он же первый аргумент reduce, и использовать пустой объект в качестве второго аргумента.
var bookprice = [
["book1", ""],
["book2", ""],
["book3", ""]
];
var result = bookprice.reduce(function(object, el) {
object[el[0]] = el[1]
return object;
}, {})
console.log(result)
вам не нужен цикл for, так как reduce уже выполняет итерации по массиву.
используя Array.reduce()
, Array destructuration
, Dynamical keys
и Spread operator
.
const bookprice = [
['book1', ''],
['book2', ''],
['book3', ''],
];
const ret = bookprice.reduce((tmp, [
name,
price,
]) => ({
...tmp,
[name]: price,
}), {});
console.log(ret);
вы не возвращаете накопленный объект в своей функции reduce, и цикл for не нужен.
попробуй:
const bookprice = [["book1", ""], ["book2", ""], ["book3", ""]];
const nameIndex = 0;
const priceIndex = 1;
const bookPricesObj = bookprice.reduce((prices, bookInfo) => {
const name = bookInfo[nameIndex];
const price = bookInfo[priceIndex];
prices[name] = price;
return prices;
}, {});
bookprice.reduce((acc, price) => {
let tmp = {}
tmp[price[0]] = price[1]
return Object.assign(acc, tmp)
}, {})
С помощью массив.прототип.уменьшить преобразование вложенного массива в объект
var bookprice = [
["book1", ""],
["book2", ""],
["book3", ""]
];
bookpriceObj = bookprice.reduce(function(acc, cur, i) {
acc[cur[0]] = cur[1];
return acc;
}, {})
console.log(bookpriceObj);