将嵌套数组中的2个值相乘,然后推送到一个新数组-JavaScript Vue
我有一个数组,我试图将两个值相乘将嵌套数组中的2个值相乘,然后推送到一个新数组-JavaScript Vue,javascript,arrays,node.js,vue.js,vuejs2,Javascript,Arrays,Node.js,Vue.js,Vuejs2,我有一个数组,我试图将两个值相乘qty和packageQuantity,创建一个新数组,结果设置为units键 问题是我有一个复杂的嵌套数组,无法解决如何创建新数组 我已经知道了如何进行乘法,但是我不知道如何将值推送到一个新数组 我正在使用Vue,如果可能的话,希望实时更改这些值 如何进行乘法,创建一个新数组,将结果放入单位键? 为了澄清,我想创建一个新数组,将新结果放入,同时也将旧值添加进去。见下文 非常感谢 这是我当前的阵列: data: () => ({ sites: [ {
qty
和packageQuantity
,创建一个新数组,结果设置为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))
)
)
您可以将已经完成的任务分配给
项.units
。但是你必须记住在乘法之前把值转换成整数。如果需要将结果转换为字符串,还必须将其转换回字符串。如果所有值都是数字,您将如何执行此操作:
sites.forEach(
(innerArray) => innerArray.values.forEach(item => {
item.units = item.variationName.qty * item.units;
})
)
可能值得注意的是,您所称的
innerArray
实际上并不是一个数组,而是一个对象,因此为了清晰起见,您可能需要对其进行更好的命名 以下是您可以做的:
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
。单位应该是整数吗?在您的示例中,它们似乎都是空字符串。还有,结果应该是吗?抱歉,是的!我已经更新了示例。单位值仍然是empyt字符串?谢谢!如何实现推送。如果我执行this.testArray.push({packageQty:item.variationName.qty*item.units})代码>代替item.units=item.variationName.qty*item.units代码>我得到一个包含许多值的循环!干杯@tbowden您是否尝试获取这些值的乘积,将其放入一个包含一个对象的数组中,然后将单位设置为数组?或者,在这个forEach
之外是否还有另一个数组,您正试图用对象构建它?不完全是这样。我想创建一个名为testArray的新数组,并基本上重新创建它,将产品添加到名为packageQuantity的密钥中。谢谢@鲍登:好的。我想我现在明白你想要什么了。为此,我建议使用Array.reduce
。不幸的是,由于时间关系,我现在无法向您展示我的解决方案,但如果其他人在我回来之前没有给出新的答案,我会很乐意给出新的答案。
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'
}
]
}
]