【问题标题】:push the contents of array into another array without looping将数组的内容推入另一个数组而不循环
【发布时间】:2021-10-21 20:53:50
【问题描述】:

这是一段简单的 JavaScript,我想将 orders.fooorders2.foo 的内容添加到一维 ordersArr

let _ = require('underscore');

let ordersArr = [];
let orders = {
    foo: [
        {x: 1, b: 2},
        {y: 1, c: 3},
        {a: 2, d: 4}
    ]
}

ordersArr = _.map(orders.foo, order => order)

orders2 = {
        foo: [
                {x: 2, b: 3},
                {y: 5, c: 4},
                {a: 3, d: 6}
        ]
}


let tOrders = _.map(orders2.foo, order => order);
ordersArr.push(tOrders)

console.log(ordersArr);

这段代码的问题是push在这种情况下创建了一个多维数组:

输出

[
  { x: 1, b: 2 },
  { y: 1, c: 3 },
  { a: 2, d: 4 },
  [ { x: 2, b: 3 }, { y: 5, c: 4 }, { a: 3, d: 6 } ]
]

如何迭代orders.fooorders2.foo 的内容并将它们的结果作为一维数组?

【问题讨论】:

    标签: javascript arrays underscore.js


    【解决方案1】:

    您可以将spread两个数组的内容放入新数组中

    const arr1 = [1,2,3];
    const arr2 = [4,5,6];
    const arr3 = [...arr1, ...arr2];
    console.log(arr3);
    // prints [1,2,3,4,5,6]
    

    arr2 传播到arr1 也可以。

    arr1.push(...arr2);
    console.log(arr1);
    // prints [1,2,3,4,5,6]
    

    变化很大

    ordersArr.push(tOrders)
    

    ordersArr.push(...tOrders);
    

    应该可以。

    完整答案:

    let ordersArr = [];
    let orders = {
        foo: [
            {x: 1, b: 2},
            {y: 1, c: 3},
            {a: 2, d: 4}
        ]
    }
    
    orders2 = {
            foo: [
                    {x: 2, b: 3},
                    {y: 5, c: 4},
                    {a: 3, d: 6}
            ]
    }
    
    ordersArr.push(...orders.foo, ...orders2.foo);
    

    【讨论】:

      【解决方案2】:

      使用下划线_.flatten:

      const 
        orders = { foo: [ {x: 1, b: 2}, {y: 1, c: 3}, {a: 2, d: 4} ] },
        orders2 = { foo: [ {x: 2, b: 3}, {y: 5, c: 4}, {a: 3, d: 6} ] };
        
      const ordersArr = _.flatten([orders.foo, orders2.foo]);
      
      console.log(ordersArr);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore-min.js"></script>

      使用javascriptspread operator

      const 
        orders = { foo: [ {x: 1, b: 2}, {y: 1, c: 3}, {a: 2, d: 4} ] },
        orders2 = { foo: [ {x: 2, b: 3}, {y: 5, c: 4}, {a: 3, d: 6} ] };
        
      const ordersArr = [...orders.foo, ...orders2.foo];
      
      console.log(ordersArr);

      使用javascript Array#concat:

      const 
        orders = { foo: [ {x: 1, b: 2}, {y: 1, c: 3}, {a: 2, d: 4} ] },
        orders2 = { foo: [ {x: 2, b: 3}, {y: 5, c: 4}, {a: 3, d: 6} ] };
        
      const ordersArr = orders.foo.concat(orders2.foo);
      
      console.log(ordersArr);

      【讨论】:

        【解决方案3】:

        上面提到的散布运算符是 2021 年最好的方法。

        let ordersArr = [...orders.foo, ...orders2.foo];
        

        【讨论】:

          【解决方案4】:

          使用Array.concat()

          let orders1 = {
              foo: [
                  {x: 1, b: 2},
                  {y: 1, c: 3},
                  {a: 2, d: 4}
              ]
          };
          
          let orders2 = {
              foo: [
                  {x: 2, b: 3},
                  {y: 5, c: 4},
                  {a: 3, d: 6}
              ]
          };
          
          console.log( orders1.foo.concat(orders2.foo) );

          【讨论】:

            【解决方案5】:

            您可以使用concat() 合并数组并创建一个新数组:

            let tOrders = orders.foo.concat(orders2.foo);
            

            let ordersArr = [];
            let orders = {
                foo: [
                    {x: 1, b: 2},
                    {y: 1, c: 3},
                    {a: 2, d: 4}
                ]
            }
            
            ordersArr = _.map(orders.foo, order => order)
            
            orders2 = {
                foo: [
                    {x: 2, b: 3},
                    {y: 5, c: 4},
                    {a: 3, d: 6}
                ]
            }
            
            let tOrders = orders.foo.concat(orders2.foo);
            console.log(tOrders)
            <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore-min.js"></script>

            另一个使用flat()的选项

            let ordersArr = [];
            let orders = {
                foo: [
                    {x: 1, b: 2},
                    {y: 1, c: 3},
                    {a: 2, d: 4}
                ]
            }
            
            orders2 = {
                foo: [
                    {x: 2, b: 3},
                    {y: 5, c: 4},
                    {a: 3, d: 6}
                ]
            }
            
            let tOrders = [orders.foo, orders2.foo].flat();
            console.log(tOrders)

            【讨论】:

              【解决方案6】:

              数组的不可变合并

              创建一个新数组。

              1. 使用扩展运算符合并

              let orders = {
                  foo: [
                      {x: 1, b: 2},
                      {y: 1, c: 3},
                      {a: 2, d: 4}
                  ]
              }
              
              let orders2 = {
                  foo: [
                      {x: 2, b: 3},
                      {y: 5, c: 4},
                      {a: 3, d: 6}
                   ]
              }
              
              const mergeResult = [...orders.foo, ...orders2.foo];
              console.log(mergeResult);
              1. 使用array.concat()方法合并

              let orders = {
                  foo: [
                      {x: 1, b: 2},
                      {y: 1, c: 3},
                      {a: 2, d: 4}
                  ]
              }
              
              let orders2 = {
                  foo: [
                      {x: 2, b: 3},
                      {y: 5, c: 4},
                      {a: 3, d: 6}
                   ]
              }
              
              const mergeResult = orders.foo.concat(orders2.foo);
              console.log(mergeResult);

              数组的可变合并

              将其合并到现有数组中。

              1. 使用array.push()方法合并

              let orders = {
                  foo: [
                      {x: 1, b: 2},
                      {y: 1, c: 3},
                      {a: 2, d: 4}
                  ]
              }
              
              let orders2 = {
                  foo: [
                      {x: 2, b: 3},
                      {y: 5, c: 4},
                      {a: 3, d: 6}
                   ]
              }
              
              orders.foo.push(...orders2.foo);
              console.log(orders.foo);

              【讨论】:

                【解决方案7】:

                我将在列表中再添加一种风味。您可以使用内置的slice 方法创建数组的浅拷贝,该方法已经使用了很长时间:

                var ordersArr = orders.foo.slice();
                

                现在您可以使用pushapply 添加另一个数组的内容:

                ordersArr.push.apply(ordersArr, orders2.foo);
                

                等等,ordersArr 现在是一个一维数组,包含orders.fooorders2.foo 的所有元素。甚至可以在 ES3 中使用!

                为了获得灵感,您可以在the Underscore source code 中找到很多类似的小技巧。

                【讨论】:

                  【解决方案8】:

                  我认为这对你有用。

                  let tOrders = _.map(orders2.foo, order => order);
                  tOrders.foreach((element)=>{
                  ordersArr.push(element)
                  })
                  console.log(ordersArr);
                  

                  【讨论】:

                  • 帖子标题说没有循环,但这个答案会工作
                  猜你喜欢
                  • 2017-06-22
                  • 1970-01-01
                  • 2014-11-12
                  • 2016-05-05
                  • 1970-01-01
                  • 2022-01-03
                  • 2013-01-14
                  相关资源
                  最近更新 更多