缺少对象和值的Javascript填充数组
我有一个类似于bellow的数组,每个索引包含不同的对象集,我想创建一个统一的数据,其中每个索引中缺少的对象的值为:0缺少对象和值的Javascript填充数组,javascript,arrays,object,Javascript,Arrays,Object,我有一个类似于bellow的数组,每个索引包含不同的对象集,我想创建一个统一的数据,其中每个索引中缺少的对象的值为:0 var d = [ [ {axis:"Email",value:59,id:1}, {axis:"Social Networks",value:56,id:2}, ], [ {axis:"Sending Money",value:18,id:6
var d = [
[
{axis:"Email",value:59,id:1},
{axis:"Social Networks",value:56,id:2},
],
[
{axis:"Sending Money",value:18,id:6},
{axis:"Other",value:15,id:7},
]
];
如何使用上面的数组获得像bellow这样的数组
var d = [
[
{axis:"Email",value:59,id:1},
{axis:"Social Networks",value:56,id:2},
{axis:"Sending Money",value:0,id:6},
{axis:"Other",value:0,id:7},
],
[
{axis:"Email",value:0,id:1},
{axis:"Social Networks",value:0,id:2},
{axis:"Sending Money",value:18,id:6},
{axis:"Other",value:15,id:7},
]
];
有两个功能: getAllEntries,查找所有对象并将其存储到变量accEntries中。然后使用accEntries搜索d的子数组中的所有事件。整个过程是在checkArray中完成的 checkArray用于获取d中所有已找到和未找到的条目。这两个数组(已找到和未找到)随后用于构建新的子数组,该子数组包含具有特定值的已找到项和/或值为0的未找到项 希望这有助于:
var d=[
[
{
axis:“电子邮件”,
价值:59,
身份证号码:1
},
{
轴心:社交网络,
价值:56,
身份证号码:2
},
],
[
{
轴心国:"寄钱",,
价值:18,
身份证号码:6
},
{
轴:'其他',
价值:15,
身份证号码:7
},
]
];
函数getAllEntries(数组){
var Uniquentries=[];
array.forEach(函数(子数组){
子数组forEach(函数(obj){
if(uniquentries.indexOf(obj)=-1)uniquentries.push(obj);
});
});
返回Uniquentries;
}
函数checkArray(数组,acceptedEntries){
var结果=[];
array.forEach(函数(子数组){
var子结果=[];
var foundEntries=[];
子数组forEach(函数(obj){
if(foundEntries.indexOf(对象轴)=-1)foundEntries.push(对象轴);
});
var notFound=acceptedEntries.filter(函数(已接受){
返回foundEntries.indexOf(accepted.axis)=-1;
});
foundEntries.forEach(函数(已找到){
子数组forEach(函数(obj){
如果(obj.axis==找到)子结果推送(obj);
});
});
forEach(函数(notFound,索引){
subResult.push({
axis:notfound.axis,
值:0,
id:notfound.id
});
});
结果。推送(子结果);
});
返回结果;
}
var accEntries=getAllEntries(d);
var结果=检查数组(d,accEntries);
控制台日志(结果)代码>您可以在数组上循环以查找所有唯一对象,然后再次循环以推送与唯一键的对象数组相比不存在的值
您可以使用ES6语法查找是否存在具有属性的对象,如uniKeys.findIndex(obj=>obj.axis==val.axis)
和使用零值进行推送的方法使用扩展语法,如d[index].push({…val,值:0})代码>
下面是实现的代码段
var d=[
[
{axis:“电子邮件”,值:59,id:1},
{axis:“社交网络”,值:56,id:2},
],
[
{axis:“汇款”,价值:18,id:6},
{轴:“其他”,值:15,id:7},
{axis:“社交网络”,价值:89,id:2},
]
];
var uniKeys=[];
$。每个(d,功能(索引,项目){
$。每个(项目、功能(idx、val){
const pos=uniKeys.findIndex(obj=>obj.axis===val.axis);
如果(位置==-1){
单键按键(val);
}
})
})
$。每个(d,功能(索引,项目){
var-temp=[];
$.each(单键,函数(idx,val){
const pos=item.findIndex(obj=>obj.axis===val.axis);
如果(位置==-1){
d[index].push({…val,值:0});
}
})
})
控制台日志(d);
一个简短的浅拷贝
函数(Object.assign
在IE中不可用)或者少于10行新代码如何
var d = [
[
{axis:"Email",value:59,id:1},
{axis:"Social Networks",value:56,id:2}
],
[
{axis:"Sending Money",value:18,id:6},
{axis:"Other",value:15,id:7}
]
];
var newD_0 = [shallowCopy(d[0][0]), shallowCopy(d[0][1]), shallowCopy(d[1][0]), shallowCopy(d[1][1])];
var newD_1 = [shallowCopy(d[0][0]), shallowCopy(d[0][1]), shallowCopy(d[1][0]), shallowCopy(d[1][1])];
newD_0[2].id = 0;
newD_0[3].id = 0;
newD_1[0].id = 0;
newD_1[1].id = 0;
d = [newD_0, newD_1];
function shallowCopy(obj) {
var copy = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = obj[key];
}
}
return copy;
}
console.log(JSON.stringify(d));
结果:
[
[
{
"axis":"Email",
"value":59,
"id":1
},
{
"axis":"Social Networks",
"value":56,
"id":2
},
{
"axis":"Sending Money",
"value":18,
"id":0
},
{
"axis":"Other",
"value":15,
"id":0
}
],
[
{
"axis":"Email",
"value":59,
"id":0
},
{
"axis":"Social Networks",
"value":56,
"id":0
},
{
"axis":"Sending Money",
"value":18,
"id":6
},
{
"axis":"Other",
"value":15,
"id":7
}
]
]
你的问题是什么?通过迭代。有可能做到这一点吗?如果是,如何操作?是否有操作数组的函数?@matrixwebtech原生JS方法就是您所需要的。此外,在SO上,人们通常不喜欢回答提问者没有表现出自己解决问题的兴趣的问题。数组中的顺序重要吗?为什么电子邮件
是第一个而不是汇款
?名称列表是固定的还是要根据现有数据进行计算?如果您可以提供列表,例如,var headers=['Email'、'Social Networks'、'Sending Money'、'Other']
,那么即使按照所需的顺序,也很容易生成输出。如果不能,那么仍然很容易生成缺少的条目,但顺序不能保证。至少,当您按“运行代码片段”时,您可以查看所需的数组。描述仍在继续请不要误会,但第二个子数组中的社交网络是否正确?“或者我的眼睛上有西红柿吗?”布劳哈利,我想我的意思是对的。为了演示,我在原始数组中添加了一个额外的对象,只是为了说明两个数组中都存在该对象时的情况,请先查看我的输入