【问题标题】:Convert nested array to an object将嵌套数组转换为对象
【发布时间】:2019-01-31 02:49:19
【问题描述】:

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

我要转换var bookprice = [["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"]
}

【问题讨论】:

  • 在我看来,您正在尝试像使用 for 循环一样使用 reducer,但这是一个不同的概念。不要引用它之外的变量,所有的东西都已经在 reducer 的参数中了。同一个累加器逐个元素地传递整个事物,并且您将事物“收集”到它(或总和或您拥有的东西)。但在这种情况下,一个简单的 for 循环可能会更快。

标签: javascript arrays javascript-objects


【解决方案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;
}, {});

【讨论】:

    【解决方案2】:

    您可以将 reduce 与数组解构一起使用。

        bookpriceObj = bookprice.reduce((a, [b, c]) => (a[b] = c, a), {});
    

    发生了什么:

    • a 是累加器,它具有传递给reduce 的最终参数的初始值。我们传递的最后一个值是{},所以它是一个对象
    • 数组解构可以立即将数组中的值赋给变量。 a.e. [a, b] = ["one", "two"]a 赋值 "one"b 赋值 "two"
    • 在每个项目的每次迭代中,我们将 b(ae "book1") 的值分配为对象 (a) 的属性,并赋予它等于 c(ae "$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)

    【讨论】:

      【解决方案3】:

      使用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);

      【讨论】:

        【解决方案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)

        你不需要 for 循环,因为 reduce 已经遍历了数组。

        【讨论】:

          【解决方案5】:

          使用Array.reduce()Array destructurationDynamical keysSpread operator

          const bookprice = [
            ['book1', '$5'],
            ['book2', '$2'],
            ['book3', '$7'],
          ];
          
          const ret = bookprice.reduce((tmp, [
            name,
            price,
          ]) => ({
            ...tmp,
          
            [name]: price,
          }), {});
          
          console.log(ret);

          【讨论】:

            【解决方案6】:
            bookprice.reduce((acc, price) => {
              let tmp = {}
              tmp[price[0]] = price[1]
              return Object.assign(acc, tmp)
            }, {})
            

            【讨论】:

            • 请在您的回答中添加一些解释。
            【解决方案7】:

            使用 forEach 更短

            var bookprice = [["book1", "$5"], ["book2", "$2"], ["book3", "$7"]];
            
            var bookpriceObj = {};
            
            
            bookprice.forEach(e=>bookpriceObj[e[0]] = e[1]);
            
            console.log(bookpriceObj)

            【讨论】:

            • 你有一个入口值,一个数组循环和一个结束值,它绝对适合Array.reduce
            • @GrégoryNEUT 我知道,但在这种情况下我不是 reduce 的忠实粉丝,最终值是一个对象,而不是单个值(这是目的)。我认为使用循环更清楚。在我看来,reduce() 更好地减少,找到一个单一的值作为最终值。
            猜你喜欢
            • 2015-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多