Javascript解析json对象并在字段不同时添加0

问题描述

我有一个 json 对象,它有 3 个字段:数字、名称、类型,但类型并不总是存在于每个名称中。这是我的对象:

myObj=
[{numbers: 10,name: object1,type: type1},{numbers: 2,type: type2}
{numbers: 15,type: type3}
{numbers: 16,type: type4}
{numbers: 12,name: object2,type: type2}
{numbers: 10,type: type4}
{numbers: 1,name: object3,type: type3}
{numbers: 2,name: object4,type: type1}
{numbers: 4,type: type2}
{numbers: 3,type: type3}
{numbers: 1234,type: type4}
]

正如你所看到的,不是每个对象都拥有所有类型,结果类型数组应该具有以下结构:

finalNames = [object1,object2,object3,object4];
resultType1Array = [type1NumbersObject1,type1NumbersObject2,type1NumbersObject3,type1NumbersObject4];
resultType2Array = [type2NumbersObject1,type2NumbersObject2,type2NumbersObject3,type2NumbersObject4];
//and so on

问题是并非每个对象都包含所有 4 种类型,每当我没有类型时,我都想在它应该属于的位置添加一个 0。 所以在我的情况下是:

resultType1Array = [10,2]
resultType2Array = [2,12,4]
resultType3Array = [15,1,3]
resultType4Array = [16,10,1234]

但是我不能插入 0 并且我得到了值错误的数组。我怎样才能实现这个解决方案? 这是我的代码

myObj.forEach(v => names.push(v[Object.keys(v)[1]]));
myObj.forEach(v =>{
if(v.Type === "type1"){
    resultType1Array.push(v[Object.keys(v)[0]]);
}
if(v.Type === "type2"){
    resultType2Array.push(v[Object.keys(v)[0]]);
}
if(v.Type === "type3"){
    resultType3Array.push(v[Object.keys(v)[0]]);
}
if(v.Type === "type4"){
    resultType4Array.push(v[Object.keys(v)[0]]);
}


totalNames = [...new Set(names)];

})

我得到的结果可以在数组中包含可变数量的元素,具体取决于对象中某种类型的存在与否。这是我的结果:

resultType1Array = [10,1234]

如果名称没有特定类型,如何在 resultArray 的正确位置放置 0? 谢谢

解决方法

您只需要创建一个长度为 4(或 n,其中 n 是对象的最大数量)的数组并用零初始化它。然后,您可以在该索引处插入值,而忽略其余部分。

以下代码适用于 4 个对象(因为数组初始化为 4),但您可以通过查找或将参数传递给可能的最大对象数的函数,轻松地将其扩展为 n 个对象。

var myObj = [{
    numbers: 10,name: 'object1',type: 'type1'
  },{
    numbers: 2,type: 'type2'
  },{
    numbers: 15,type: 'type3'
  },{
    numbers: 16,type: 'type4'
  },{
    numbers: 12,name: 'object2',{
    numbers: 10,{
    numbers: 1,name: 'object3',name: 'object4',{
    numbers: 4,{
    numbers: 3,{
    numbers: 1234,type: 'type4'
  }
]

function createArray(arr,largestObjectNumber = 4) {

  var res = [];
  var map = {};

  arr.forEach(item => {
    if (map[item.type]) {
      map[item.type] = [...map[item.type],item];
    } else {
      map[item.type] = [item];
    }
  });

  for (let i in map) {
    var ans = new Array(largestObjectNumber).fill(0);

    map[i].forEach(item => {
      ans[parseInt(item.name.match(/\d+/),10) - 1] = item.numbers;
    });

    res.push(ans);
  }

  return res;
}

console.log(createArray(myObj));