问题描述
我有一个 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));