将嵌套数组中的2个值相乘,然后推入新数组-JavaScript Vue

时间:2019-06-17 22:33:01

标签: javascript arrays node.js vue.js vuejs2

我有一个数组,我试图将两个值qtypackageQuantity相乘,创建一个新数组,并将结果设置为units键。

麻烦是我有一个复杂的嵌套数组,无法锻炼如何创建新数组!

我已经弄清楚如何进行乘法运算,但是我不知道如何将值推入新数组。

我正在使用Vue,并且希望在可能的情况下实时更改这些值。

如何进行乘法运算,创建一个将结果放入单位键的新数组?

为澄清起见,我想创建一个新数组,将新结果放入其中,同时也添加旧值。参见下文。

非常感谢!

这是我当前的数组:

data: () => ({
sites: [

  {
    sku: "10001",
    values: [
      {
        variationName: { name: "Unpackaged", qty: 1 },
        units: '',
        packageQuantity: '2'
      }
    ]
  },
  {
    sku: "10002",
    values: [
      {
        variationName: { name: "2 Pack", qty: 2 },
        units: '',
        packageQuantity: '3'
      },
      {
        variationName: { name: "4 Pack", qty: 4 },
        units: '',
        packageQuantity: '1'
      }
    ]
  }
    ]
})

这是我希望输出的内容:

sites: [

  {
    sku: "10001",
    values: [
      {
        variationName: { name: "Unpackaged", qty: 1 },
        units: '2', // 1 * 2
        packageQuantity: '2'
      }
    ]
  },
  {
    sku: "10002",
    values: [
      {
        variationName: { name: "2 Pack", qty: 2 },
        units: '6', // 2 * 3
        packageQuantity: '3'
      },
      {
        variationName: { name: "4 Pack", qty: 4 },
        units: '4', // 1 * 4
        packageQuantity: '1'
      }
    ]
  }
    ]

这是我的计算:

 sites.forEach(
  (innerArray) => innerArray.values.forEach(
   (item => console.log(item.variationName.qty * item.units))
  )
 )

3 个答案:

答案 0 :(得分:1)

           let newData=[]; 
            let sites = [

                {
                    sku: "10001",
                    values: [{
                        variationName: {
                            name: "Unpackaged",
                            qty: 1
                        },
                        units: '',
                        packageQuantity: '2'
                    }]
                },
                {
                    sku: "10002",
                    values: [{
                            variationName: {
                                name: "2 Pack",
                                qty: 2
                            },
                            units: '',
                            packageQuantity: '3'
                        },
                        {
                            variationName: {
                                name: "4 Pack",
                                qty: 4
                            },
                            units: '',
                            packageQuantity: '1'
                        }
                    ]
                }
            ]
            for (let i = 0; i < sites.length; i++) {
                let iData = sites[i].values;
                for (let j = 0; j < iData.length; j++) {
                    iData[j].units = parseInt(iData[j].packageQuantity) * parseInt(iData[j].variationName.qty);
                }

            }
             newData.push(sites);

输出

    newData: [
            {
                sku: "10001",
                values: [{
                    variationName: {
                        name: "Unpackaged",
                        qty: 1
                    },
                    units: 2, 
                    packageQuantity: '2'
                }]
            },
            {
                sku: "10002",
                values: [{
                        variationName: {
                            name: "2 Pack",
                            qty: 2
                        },
                        units: 6,
                        packageQuantity: '3'
                    },
                    {
                        variationName: {
                            name: "4 Pack",
                            qty: 4
                        },
                        units: 4, 
                        packageQuantity: '1'
                    }
                ]
            }
        ]

答案 1 :(得分:0)

您可以将已经完成的工作分配给item.units。但是您必须记住在乘法之前将值转换为整数。如果需要将结果作为字符串,还必须将结果转换回字符串。如果所有值都是数字,您将执行以下操作:

 sites.forEach(
    (innerArray) => innerArray.values.forEach(item => { 
       item.units = item.variationName.qty * item.units; 
    })
 )

可能值得注意的是,您所称的innerArray并不是一个数组,而是一个对象,因此为了清楚起见,您可能希望对其更好地命名。

答案 2 :(得分:0)

这是您可以做的:

const datum = {
  sites: [

    {
      sku: "10001",
      values: [
        {
          variationName: { name: "Unpackaged", qty: 1 },
          units: 5,
          packageQuantity: ""
        }
      ]
    },
    {
      sku: "10002",
      values: [
        {
          variationName: { name: "2 Pack", qty: 2 },
          units: 3,
        },
        {
          variationName: { name: "4 Pack", qty: 4 },
          units: 6,
          packageQuantity: ""
        }
      ]
    }
      ]
  };

const qtyCalculated = datum && datum.sites && datum.sites.reduce((acc, site) => {
  if (!acc["sku"]) {
    acc["sku"] = [];
  }
  acc["sku"].push(site.sku);
  if (!acc["qty"]) {
    acc["qty"] = [];
  }
  acc["qty"].push(...site.values && site.values.reduce((valueAcc, valueItem) => {
    valueAcc.push(valueItem.variationName.qty * parseInt(valueItem.units, 10));
    return valueAcc;
  }, []));
  return acc;
}, []);

console.log(qtyCalculated);

您也可以添加名称,并为每个值项目分别计算数量。我已经在基准面中将单位声明为数字。如果您使用的是字符串,请如上所述使用parseInt