let arr1 = [
{
Num: "0001",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0002",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0003",
chr_Beijing: "xx",
chr_Shanghai: "xx"
}
]
let arr2 = [
{
Num: "0001",
Type: "T1",
T1_Beijing: "",
chr_Beijing: "xx",
T1_Shanghai: "",
chr_Shanghai: "xx"
},
{
Num: "0002",
Type: "T2",
T2_Beijing: "",
chr_Beijing: "xx",
T2_Shanghai: "",
chr_Shanghai: "xx"
},
{
Num: "0003",
Type: "T3",
T3_Beijing: "",
chr_Beijing: "xx",
T3_Shanghai: "",
chr_Shanghai: "xx"
}
]
想实现:
我的初始数据如arr1这样的对象数组,有近千条各地的数据,想转换成arr2,自动加入下面的属性:
恳请指教!
该回答引用GPTᴼᴾᴱᴺᴬᴵ
可以按照以下步骤来实现:
遍历arr1数组,生成对应的Type属性值,并根据Type的值合并生成新的属性名。
遍历arr2数组,将新生成的属性名加入到数组对象中。
将arr1中的chr_属性名与Type的值合并生成新的属性名,将其加入到arr2数组对象中,并赋值为空字符串。
下面是代码实现:
let arr1 = [
{
Num: "0001",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0002",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0003",
chr_Beijing: "xx",
chr_Shanghai: "xx"
}
]
let arr2 = [
{
Num: "0001",
Type: "T1",
T1_Beijing: "",
chr_Beijing: "xx",
T1_Shanghai: "",
chr_Shanghai: "xx"
},
{
Num: "0002",
Type: "T2",
T2_Beijing: "",
chr_Beijing: "xx",
T2_Shanghai: "",
chr_Shanghai: "xx"
},
{
Num: "0003",
Type: "T3",
T3_Beijing: "",
chr_Beijing: "xx",
T3_Shanghai: "",
chr_Shanghai: "xx"
}
]
for (let i = 0; i < arr1.length; i++) {
let num = arr1[i].Num.replace(/^0+/, ''); // 去掉前导0的整数
let type = "T" + num;
let keys = Object.keys(arr1[i]);
for (let j = 0; j < keys.length; j++) {
let key = keys[j];
if (key.indexOf("chr_") === 0) {
let city = key.replace("chr_", "");
let newKey = type + "_" + city;
arr2[i][newKey] = "";
}
}
}
代码说明:
通过正则表达式去掉Num属性中的前导0。
通过Object.keys()方法获取arr1中对象的属性名数组。
遍历属性名数组,判断是否以chr_开头,如果是则生成新的属性名,并加入到arr2中对应的数组对象中。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
List<Map<String, Object>> arr1 = new ArrayList<Map<String, Object>>();
Map<String, Object> obj1 = new HashMap<String, Object>();
obj1.put("Num", "0001");
obj1.put("chr_Beijing", "xx");
obj1.put("chr_Shanghai", "xx");
arr1.add(obj1);
Map<String, Object> obj2 = new HashMap<String, Object>();
obj2.put("Num", "0002");
obj2.put("chr_Beijing", "xx");
obj2.put("chr_Shanghai", "xx");
arr1.add(obj2);
Map<String, Object> obj3 = new HashMap<String, Object>();
obj3.put("Num", "0003");
obj3.put("chr_Beijing", "xx");
obj3.put("chr_Shanghai", "xx");
arr1.add(obj3);
List<Map<String, Object>> arr2 = new ArrayList<Map<String, Object>>();
for (Map<String, Object> item : arr1) {
Map<String, Object> obj = new HashMap<String, Object>();
String num = (String) item.get("Num");
String type = "T" + Integer.parseInt(num.replace("0", ""));
obj.put("Num", num);
obj.put("Type", type);
obj.put(type + "_Beijing", "");
obj.put(type + "_Shanghai", "");
obj.put("chr_Beijing", item.get("chr_Beijing"));
obj.put("chr_Shanghai", item.get("chr_Shanghai"));
arr2.add(obj);
}
System.out.println(arr2);
}
}
该代码首先定义了两个数组对象 arr1 和 arr2,其中 arr1 是初始数据,包含三个对象;arr2 则是转换后的数据,初始为空数组。然后使用 for 循环遍历 arr1 中的每个对象,为每个对象生成一个新的对象 obj,并为 obj 填充相应的属性。其中,Type 属性根据 Num 属性生成,其他属性根据 chr_ 开头的属性名和 Type 属性生成。最后将 obj 对象添加到 arr2 数组中。最后打印输出 arr2 数组。
不知道我的理解对不对,希望可以帮助到你。
该回答引用ChatGPT
可以使用循环遍历arr1数组,然后在循环中根据每个对象的Num属性值生成Type属性值,再根据每个对象的chr_后的地名合并成新的属性名,并插入到arr2数组对象中。
let arr1 = [
{
Num: "0001",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0002",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0003",
chr_Beijing: "xx",
chr_Shanghai: "xx"
}
];
let arr2 = [];
for (let i = 0; i < arr1.length; i++) {
let obj1 = arr1[i];
let num = obj1.Num;
let type = "T" + parseInt(num, 10).toString().replace(/^[0]+/g,""); // 根据Num生成Type
let obj2 = {
Num: num,
Type: type,
};
for (let prop in obj1) {
if (prop.startsWith("chr_")) {
let city = prop.replace("chr_", "");
let prop2 = type + "_" + city;
obj2[prop2] = "";
}
}
arr2.push(obj2);
}
console.log(arr2);
参考GPT和自己的思路,
let arr1 = [
{
Num: "0001",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0002",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0003",
chr_Beijing: "xx",
chr_Shanghai: "xx"
}
];
let arr2 = arr1.map(obj1 => {
let type = "T" + parseInt(obj1.Num, 10).toString();
let obj2 = {
Num: obj1.Num,
Type: type
};
Object.keys(obj1).forEach(key => {
if (key.startsWith("chr_")) {
let city = key.substr(4);
obj2[`${type}_${city}`] = "";
} else {
obj2[key] = obj1[key];
}
});
return obj2;
});
console.log(arr2);
首先使用map方法遍历arr1中的每个对象,生成一个新的对象obj2,并填入Num和Type属性。
然后使用Object.keys方法遍历当前对象的所有属性,对于以chr_开头的属性,提取出城市名,生成新的属性名,值为空字符串,加入到obj2中。对于其他属性直接复制到obj2中。最后返回obj2作为map方法的输出结果。
运行结果为:
[
{
Num: "0001",
Type: "T1",
T1_Beijing: "",
chr_Beijing: "xx",
T1_Shanghai: "",
chr_Shanghai: "xx"
},
{
Num: "0002",
Type: "T2",
T2_Beijing: "",
chr_Beijing: "xx",
T2_Shanghai: "",
chr_Shanghai: "xx"
},
{
Num: "0003",
Type: "T3",
T3_Beijing: "",
chr_Beijing: "xx",
T3_Shanghai: "",
chr_Shanghai: "xx"
}
]
let arr1 = [
{
Num: "0001",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0002",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0003",
chr_Beijing: "xx",
chr_Shanghai: "xx"
}
];
let arr2 = arr1.map((item) => {
let num = item.Num.replace(/^0+/, "");
let type = "T" + num;
let newObj = {
Num: item.Num,
Type: type
};
for (let key in item) {
if (key.startsWith("chr_")) {
let cityName = key.substring(4);
let propName = `${type}_${cityName}`;
newObj[propName] = "";
}
else {
newObj[key] = item[key];
}
}
return newObj;
});
console.log(arr2);
let arr1 = [
{
Num: "0001",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0002",
chr_Beijing: "xx",
chr_Shanghai: "xx"
},
{
Num: "0003",
chr_Beijing: "xx",
chr_Shanghai: "xx"
}
]
let arr2 = [];
arr1.forEach(item => {
let obj = {
Num: item.Num,
Type: `T${item.Num.replace(/^0+/, '')}`
};
for (let key in item) {
if (key.startsWith('chr_')) {
obj[`${obj.Type}_${key.slice(4)}`] = '';
obj[key] = item[key];
}
}
arr2.push(obj);
});