Преобразование вложенного массива в объект

Я пытаюсь использовать 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);