我有一个如下所述的对象数组。
const inputArray =[
{
name: "Energy",
quantity: [
{
qval: "100 ",
unit: "unit1"
},
{
qval: "200 ",
unit: "unit2"
}
],
},
{
name: "Fat",
quantity: [
{
qval: "300",
unit: "unit3"
}
],
},
]
我正在尝试使用以下代码重组此数组,并且得到了如下所述的内容
const outputArray = inputArray.map(function(item,i) {
return {
name: item.name,
amount: (item.quantity[0] &&
item.quantity[0].qval+item.quantity[0].unit)+'|'+ (item.quantity[1] && item.quantity[1].qval+item.quantity[1].unit),
};
});
这是我得到的输出
[
{name: "Energy", amount: "100 unit1|200 unit2"}
{name: "Fat", amount: "300unit3|undefined"}
]
由于我是新手,所以我认为这不是一个好方法,请提出任何更简单的简洁代码。 我期待
[
{name: "Energy", amount: "100 unit1|200 unit2"}
{name: "Fat", amount: "300unit3"}
]
如果该值不存在,我还需要删除“未定义”。 请提出建议。
答案 0 :(得分:2)
你去了
inputArray.map(item => ({
name: item.name,
amount: item.quantity.reduce((accumulator, currentValue) => (accumulator+currentValue.qval+currentValue.unit+"|"),"").slice(0, -1)
}))
答案 1 :(得分:2)
这是一种非常简单的方法,对于外部列表使用map
,对于每个列表使用另一个:
const combine = arr => arr.map(({name, quantity}) => ({
name,
amount: quantity.map(({qval, unit}) => `${qval}${unit}`).join('|')
}))
const inputArray = [{name: "Energy", quantity: [{qval: "100 ", unit: "unit1"}, {qval: "200 ", unit: "unit2"}]}, {name: "Fat", quantity: [{qval: "300", unit: "unit3"}]}]
console.log(combine(inputArray))
与您的方法相比,此方法的最大优点是,它可以处理任意数量的项目。第一个或第二个没有特殊情况的代码。
答案 2 :(得分:0)
使用索引之前,应检查索引中特定元素的存在。这里是相关的更改:
const outputArray = inputArray.map(function(item, i) {
var qt = "";
if (item.quantity[0]) {
qt += (item.quantity[0].qval + item.quantity[0].unit);
}
if (item.quantity[1]) {
qt += '|';
qt += (item.quantity[1].qval + item.quantity[1].unit);
}
return {
name: item.name,
amount: qt
};
});
答案 3 :(得分:0)
如果其中不确定的项目数,请使用for循环遍历item.quantity
的长度:
const outputArray = inputArray.map(function(item, i) {
let amountStr = "";
for (i = 0; i < item.quantity.length; i++) {
amountStr += item.quantity[i].qval + item.quantity[i].unit;
// add delimiter when the current item is not the last one in the array
if (i < quantity.length - 1) amountStr += "|";
}
return {
name: item.name,
amount: amountStr
};