将嵌套的数组转换为对象

7

我正在尝试使用reduce将嵌套数组转换为对象。

我想要将var bookprice = [["book1", "$5"], ["book2", "$2"], ["book3", "$7"]];转换为

``` { book1: "$5", book2: "$2", book3: "$7" } ```
var bookpriceObj = {
    "book1": "$5", 
    "book2": "$2",
    "book3": "$7"
};

以下是我尝试过的方法:

var bookprice = [["book1", "$5"], ["book2", "$2"], ["book3", "$7"]];
bookpriceObj = {};
bookprice.reduce(function(a, cv, ci, arr){
    for (var i = 0; i < arr.length; ++i)
        bookpriceObj [i] = arr[i];

    return bookpriceObj ;
})

但是下面的结果并非所期望的结果。
{
    ["book1", "$5"]
    ["book2", "$2"]
    ["book3", "$7"]
}

2
看起来你试图像使用for循环一样使用reducer,但它是一个不同的概念。不要引用在外部的变量,所有的东西都已经在reducer的参数中了。同一个累加器会逐个元素地传递整个过程,并且你可以向其中“收集”东西(或求和等)。但在这种情况下,一个简单的for循环可能会更快。 - Roope
7个回答

12

使用forEach更短

var bookprice = [["book1", "$5"], ["book2", "$2"], ["book3", "$7"]];

var bookpriceObj = {};


bookprice.forEach(e=>bookpriceObj[e[0]] = e[1]);

console.log(bookpriceObj)


你有一个入口值,对数组进行循环并有一个结束值,这绝对适合使用 Array.reduce - Orelsanpls
2
@GrégoryNEUT 我知道,但我不太喜欢在这种情况下使用reduce,因为最终值是一个对象,而不是单个值(这是目的)。我认为使用循环更清晰。在我看来,reduce() 更适合用于减少,找到一个单一的值作为最终值。 - Emeeus

4
你可以使用数组解构(Array Destructuring)与 reduce 方法一起使用。
    bookpriceObj = bookprice.reduce((a, [b, c]) => (a[b] = c, a), {});

以下是正在发生的事情:

  • a 是累加器,具有传递给reduce的最终参数的初始值。我们传递的最后一个值是{}所以它是一个对象
  • 数组解构可以立即将数组中的值分配给变量。例如:[a, b] = ["one", "two"]a 赋值为 "one" 并将b赋值为 "two"
  • 在每个迭代中,我们将b(例如"book1")的值作为属性分配给对象(a),并将其值设置为c(例如"$2")
  • 每次reduce迭代必须返回累加器(a)
  • 当所有操作完成时,结果将存储在bookpriceObj中!

var bookprice = [ ["book1", "$5"], ["book2", "$2"], ["book3", "$7"]],
bookpriceObj = bookprice.reduce((a, [b, c]) => (a[b] = c, a), {});

console.log(bookpriceObj)


4

你需要从“reducer”(即reduce的第一个参数)返回一个对象,并使用空对象作为第二个参数。

var bookprice = [
  ["book1", "$5"],
  ["book2", "$2"],
  ["book3", "$7"]
];

var result = bookprice.reduce(function(object, el) {
  object[el[0]] = el[1]
  return object;
}, {})

console.log(result)

由于 reduce 已经遍历了数组,所以您不需要使用 for 循环。

1
bookprice.reduce((acc, price) => {
  let tmp = {}
  tmp[price[0]] = price[1]
  return Object.assign(acc, tmp)
}, {})

1
请在您的答案中添加一些解释。 - dwjohnston

1
你的reduce函数没有返回累加对象,并且for循环是不必要的。
尝试使用以下代码:
const bookprice = [["book1", "$5"], ["book2", "$2"], ["book3", "$7"]];
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;
}, {});

1
使用 Array.reduce()数组解构动态键展开操作符

const bookprice = [
  ['book1', '$5'],
  ['book2', '$2'],
  ['book3', '$7'],
];

const ret = bookprice.reduce((tmp, [
  name,
  price,
]) => ({
  ...tmp,

  [name]: price,
}), {});

console.log(ret);


0
使用 Array.prototype.reduce 将嵌套数组转换为对象

var bookprice = [
  ["book1", "$5"],
  ["book2", "$2"],
  ["book3", "$7"]
];
bookpriceObj = bookprice.reduce(function(acc, cur, i) {
  acc[cur[0]] = cur[1];
  return acc;
}, {})

console.log(bookpriceObj);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接