亲,请教一个问题?
[
{
"name": "商户1",
"list": [
{
"chargeOffAmounts": 12,
"writeOffDate": "2023-02-27"
},
{
"chargeOffAmounts": 2,
"writeOffDate": "2023-03-06"
}
]
},
{
"name": "商户2",
"list": [
{
"chargeOffAmounts": 1,
"writeOffDate": "2023-03-05"
}
]
}
]
[
{
"name": "商户1",
"list": [
{
"chargeOffAmounts": 12,
"writeOffDate": "2023-02-27"
},
{
"chargeOffAmounts": 0,
"writeOffDate": "2023-03-05"
},
{
"chargeOffAmounts": 2,
"writeOffDate": "2023-03-06"
}
]
},
{
"name": "商户2",
"list": [
{
"chargeOffAmounts": 0,
"writeOffDate": "2023-02-27"
},
{
"chargeOffAmounts": 1,
"writeOffDate": "2023-03-05"
},
{
"chargeOffAmounts": 0,
"writeOffDate": "2023-03-06"
}
]
}
]
怎么把上面的结构改成下面的。
该答案引用 chatgpt @瞬间的未来式
<script type="text/javascript">
let arr = [
{
"name": "商户1",
"list": [
{
"chargeOffAmounts": 12,
"writeOffDate": "2023-02-27"
},
{
"chargeOffAmounts": 2,
"writeOffDate": "2023-03-06"
}
]
},
{
"name": "商户2",
"list": [
{
"chargeOffAmounts": 1,
"writeOffDate": "2023-03-05"
}
]
}
];
// 获取所有日期列表
let dateList = Array.from(new Set(arr.flatMap(item => item.list.map(entry => entry.writeOffDate)))).sort();
// 补全日期和chargeOffAmounts字段
let newArr = arr.map(item => {
let newList = [];
dateList.forEach(date => {
let entry = item.list.find(obj => obj.writeOffDate === date);
if (entry) {
newList.push(entry);
} else {
newList.push({
chargeOffAmounts: 0,
writeOffDate: date
});
}
});
return {
name: item.name,
list: newList
};
});
console.log(newArr);
</script>
要将一个类数组对象转换为一个真正的数组,必须具备以下条件:
let arrayLike = {
0: 'tom',
1: '65',
2: '男',
3: ['jane','john','Mary'],
'length': 4
}
let arr = Array.from(arrayLike)
console.log(arr) // ['tom','65','男',['jane','john','Mary']]
针对这个问题,可以使用 map() 方法对数组进行转换,具体步骤如下:
const objTemplate = {
id: null,
name: '',
age: 0,
score: 0
};
const newArray = oldArray.map((item) => {
const newObj = {...objTemplate, ...item};
return newObj;
});
首先,定义了一个对象模板 objTemplate,其中每个属性的初始值用于表示数据的类型。
然后,使用 map() 方法遍历 oldArray,对每个元素应用模板进行转换。模板中的属性名必须和数组元素中的属性名一一对应。可以使用 ES6 的展开语法和对象合并语法({...obj1, ...obj2})来实现将模板中的属性和元素中的属性合并到一个新的对象中。
最后,将新的对象添加到一个新的数组中,该数组通过 map() 方法返回。
下面是完整的代码示例,为了方便测试,生成了一个随机数组作为原始数据:
// 生成一个随机数组作为原始数据
const oldArray = Array.from({length: 5}, () => ({
id: Math.floor(Math.random() * 100),
name: 'name' + Math.floor(Math.random() * 100),
age: Math.floor(Math.random() * 10) + 20,
score: Math.floor(Math.random() * 60) + 40
}));
console.log('原始数组:', oldArray);
// 定义要转换成的数据结构的模板
const objTemplate = {
id: null,
name: '',
age: 0,
score: 0
};
// 遍历数组,将每个元素转换成一个新对象,并存放到新数组中
const newArray = oldArray.map((item) => {
const newObj = {...objTemplate, ...item};
return newObj;
});
console.log('转换后的数组:', newArray);
运行代码后,可以看到输出结果:
原始数组:
[ { id: 51, name: 'name73', age: 22, score: 54 },
{ id: 91, name: 'name91', age: 27, score: 45 },
{ id: 51, name: 'name52', age: 21, score: 94 },
{ id: 0, name: 'name33', age: 25, score: 91 },
{ id: 27, name: 'name1', age: 23, score: 61 } ]
转换后的数组:
[ { id: 51, name: 'name73', age: 22, score: 54 },
{ id: 91, name: 'name91', age: 27, score: 45 },
{ id: 51, name: 'name52', age: 21, score: 94 },
{ id: 0, name: 'name33', age: 25, score: 91 },
{ id: 27, name: 'name1', age: 23, score: 61 } ]
从输出结果可以看出,原始数组和转换后的数组是一致的,表明转换成功。