根据原数组属性值增加若干属性


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,自动加入下面的属性:

  1. 根据arr1的Num值,生成arr2的 Type属性,值为Num值去掉0的整数,并在前加“T”字符。
  2. 根据arr1中的属性名 chr_后的地名,与Type的值,合并成新的属性名,值为空。并自动插入相应的数组对象中。

恳请指教!

该回答引用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] = "";
    }
  }
}



代码说明:

  1. 通过正则表达式去掉Num属性中的前导0。

  2. 通过Object.keys()方法获取arr1中对象的属性名数组。

  3. 遍历属性名数组,判断是否以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);
});