如何在动态解决方案中通过内部数组循环嵌套数组

Posted

技术标签:

【中文标题】如何在动态解决方案中通过内部数组循环嵌套数组【英文标题】:How to Loop a Nested array by the Inside Array in dynamic solution 【发布时间】:2022-01-09 10:29:07 【问题描述】:

我的代码有问题,因为我认为如果在我的嵌套数组中插入新数组不灵活,我不会考虑新数组。重要的是如何访问每个数组的第一个元素,然后是第二个元素,依此类推。

这是一个例子:

    const nestedArr = [
    [
            "COCA - COLA ORIGINAL 355 ML VIDRIO RET",
            "COCA - COLA ORIGINAL 600 ML PET NR",
            "COCA - COLA ORIGINAL 2.5 LT RET"],
        [
            "$176.02",
            "$100.00",
            "$130.00"
        ],
        [
            "10",
            "3",
            "15"
        ]
    ]

const ordersObj = []

for (let i=0; i< nestedArr[0].length; i++)
    var name = orderArr[0][i];
    var price = Number(orderArr[1][i].replace("$",""));
    var qty = orderArr[2][i];
    var amount =  price * qty;
    ordersObj.push(name,price,qty,amount)
 

我想要做的是避免放置 0,1,2 来设置我想要访问的嵌套数组的位置,我想运行一个循环或更改我的代码,以便 0,1,2没有硬编码。

问候

【问题讨论】:

另外请添加预期的结果 - 谢谢 【参考方案1】:

我猜你的代码似乎有点乱:

const nestedArr = [
    [
            "COCA - COLA ORIGINAL 355 ML VIDRIO RET",
            "COCA - COLA ORIGINAL 600 ML PET NR",
            "COCA - COLA ORIGINAL 2.5 LT RET"],
        [
            "$176.02",
            "$100.00",
            "$130.00"
        ],
        [
            "10",
            "3",
            "15"
        ]
    ]

const ordersObj = []

for (let i=0; i< nestedArr[0].length; i++)
    // This has no value yet
    // var name = orderArr[0][i];
    // this should be
    var name = nestedArr[0][i]
    var price = Number(nestedArr[1][i].replace("$",""));
    var qty = nestedArr[2][i];
    var amount =  price * qty;
    ordersObj.push(name,price,qty,amount)
 

【讨论】:

【参考方案2】:

我建议不要尝试在一个循环中完成所有操作,而是为您的对象定义一个构造函数,并将源 nestedArr 映射到一个更有用的二维数组,其中每个属性在子目录中的给定索引处数组(此处使用实用程序 zip 函数,请参阅 this question 进行讨论)。

const nestedArr = [
  ['COCA - COLA ORIGINAL 355 ML VIDRIO RET', 'COCA - COLA ORIGINAL 600 ML PET NR', 'COCA - COLA ORIGINAL 2.5 LT RET'],
  ['$176.02', '$100.00', '$130.00'],
  ['10', '3', '15'],
];

const OrderObj = ([name, price, qty]) => 
  const _price = Number(price.replace('$', ''));
  const _qty = Number(qty);

  return 
    name,
    price: _price,
    qty: _qty,
    amount: _price * _qty,
  ;
;

const zip = (...rows) => [...rows[0]].map((_, i) => rows.map((row) => row[i]));

const orderObjs = zip(...nestedArr).map(OrderObj);

console.log(orderObjs);

// console.log(zip(...nestedArr));
/*
[
  [ 'COCA - COLA ORIGINAL 355 ML VIDRIO RET', '$176.02', '10' ],
  [ 'COCA - COLA ORIGINAL 600 ML PET NR', '$100.00', '3' ],
  [ 'COCA - COLA ORIGINAL 2.5 LT RET', '$130.00', '15' ]
]
*/

nestedArr 添加更多行只需要调整构造函数以使用destructured 参数作为nestedArr 中行的图例来考虑新行。

const nestedArr = [
  ['COCA - COLA ORIGINAL', 'COCA - COLA ORIGINAL', 'COCA - COLA ORIGINAL'],
  ['$176.02', '$100.00', '$130.00'],
  ['355 ML VIDRIO RET', '600 ML PET NR', '2.5 LT RET'], // <─── added row
  ['10', '3', '15'],
];

//                               ┌───────────────────────────── added index
const OrderObj = ([name, price, size, qty]) => 
  const _price = Number(price.replace('$', ''));
  const _qty = Number(qty);

  return 
    name,
    size, // <───────────────────────────────────────────────── added property
    price: _price,
    qty: _qty,
    amount: _price * _qty,
  ;
;

const zip = (...rows) => [...rows[0]].map((_, i) => rows.map((row) => row[i]));

const orderObjs = zip(...nestedArr).map(OrderObj);

console.log(orderObjs);

【讨论】:

以上是关于如何在动态解决方案中通过内部数组循环嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 8 中通过循环获取数组数据

在 Swig 中通过 ref 返回动态数组

如何在没有嵌套订阅的情况下使用 rxjs 处理内部订阅数组

项目中阶梯费率解决方法,数组中通过键名查找键值

在 Python 中通过线程/核心/节点并行化 for 循环

bash中通过关联数组的foreach循环仅返回最后一个元素