Javascript 将数组的子集与原始数组进行比较
我有两个数组,都包含对象,它们之间的公共字段是名称。我想将这些数组中的数据输出到一个简单的表中。但是,由于一个数组是另一个数组的子集,因此在填充表时,数据不在正确的位置。我想用Javascript 将数组的子集与原始数组进行比较,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有两个数组,都包含对象,它们之间的公共字段是名称。我想将这些数组中的数据输出到一个简单的表中。但是,由于一个数组是另一个数组的子集,因此在填充表时,数据不在正确的位置。我想用0来填补这些空白。例如: // Array 1: [ { Name: A, Value: 7 }, { Name: B, Value: 13 }, { Name: C, Value: 36 }, { Name: D, Value: 43 } ] // Array 2: [ { Name: A,
0
来填补这些空白。例如:
// Array 1:
[
{ Name: A, Value: 7 },
{ Name: B, Value: 13 },
{ Name: C, Value: 36 },
{ Name: D, Value: 43 }
]
// Array 2:
[
{ Name: A, Value: 3 },
{ Name: C, Value: 21 },
{ Name: D, Value: 15 }
]
目前,输出表如下所示:
A | 3 | 7
B | 21 | 13
C | 15 | 36
D | | 43
A | 3 | 7
B | 0 | 13
C | 21 | 36
D | 15 | 43
但我希望它看起来像这样:
A | 3 | 7
B | 21 | 13
C | 15 | 36
D | | 43
A | 3 | 7
B | 0 | 13
C | 21 | 36
D | 15 | 43
我使用的代码是:
for(var j = 0; j < array1.length; j++) {
var row = "<tr><td>Name : " + array1[j]["Name"] + "</td>" +
"<td>Name : " + array2[j]["Value"] + "</td>" +
"<td>Name : " + array1[j]["Value"] + "</td></tr>";
$("#TABLE").append(row);
}
for(var j=0;j
这只是一个示例,我当前的代码遵循相同的行,但是,初始数据直接从数据库中提取并插入到JSON数组中。在此方面的任何帮助都将不胜感激。谢谢据我所知,您需要一个名为| arr2 | arr1的表,优先考虑arr1,因此请尝试以下方法:
//数组1:
var arr1=[{Name:“A”,Value:7},{Name:“B”,Value:13},{Name:“C”,Value:36},{Name:“D”,Value:43}];
//阵列2:
var arr2=[{Name:“A”,值:3},{Name:“C”,值:21},{Name:“D”,值:15}];
var结果=arr1.map(函数(el1){
返回“+el1.Name+”|“+(arr2.filter(函数(el2)){
返回el1.Name==el2.Name;
}).map(功能(el2){
返回el2.值;
})[0]| | 0)+“|”+el1.Value+”;
}).加入(“”);
$('#result').html(result)代码>
您可以做的不是在数组1中循环,而是首先检查相同的名称是否也在数组2中。如果是,则可以使用该array2
值,但如果不是,则应使用0
以下代码将引导您到达:
var array1=[{Name:“A”,值:7},{Name:“B”,值:13},{Name:“C”,值:36},{Name:“D”,值:43}]
var array2=[{Name:“A”,值:3},{Name:“C”,值:21},{Name:“D”,值:15}]
对于(var j=0;j
表tr td,表tr th{
填充:10px;
边框:1px纯黑;
}
名称
阿拉瓦
阿拉瓦
var行=$(“00”。重复(4));
变量数组1=[
{Name:“A”,值:7},
{名称:“B”,值:13},
{名称:“C”,值:36},
{名称:“D”,值:43}
]
变量array2=[
{Name:“A”,值:3},
{名称:“C”,值:21},
{名称:“D”,值:15}
]
对于(变量i=0;i
您可以使用以下功能:
// for each item in the first array...
array1.forEach(function(item) {
// try to find a match in the second array
var item2 = array2.find(function(i) { return i.Name === item.Name; });
// build out the row HTML, defaulting a value of 0 when match is not found
var row = "<tr><td>Name : " + item.Name + "</td>" +
"<td>Name : " + (item2 ? item2.Value : 0) + "</td>" +
"<td>Name : " + item.Value + "</td></tr>";
// append row to table
$("#TABLE").append(row);
});
//对于第一个数组中的每个项。。。
阵列1.forEach(功能(项目){
//尝试在第二个数组中查找匹配项
var item2=array2.find(函数(i){returni.Name==item.Name;});
//生成HTML行,未找到匹配项时默认值为0
var row=“Name:”+项目名称+“”+
名称:“+(项2?项2.值:0)+”+
名称:“+item.Value+”;
//将行追加到表中
$(“#表”)。追加(行);
});
这不是最有效的方法,但仍然想指出,这种方法也可以做到
var a=[
{Name:“A”,值:7},
{名称:“B”,值:13},
{名称:“C”,值:36},
{名称:“D”,值:43}
];
变量b=[
{Name:“A”,值:3},
{名称:“C”,值:21},
{名称:“D”,值:15}
];
var temp=a.concat(b);
var输出=[];
对于(var i=0;我只是想说明一下,我相信使用您的代码片段,您的输出表实际上会完全丢失一行,因为array2
只有3个项目的长度。从array1
中获取额外的元素不会循环第四次。这在我看来提出了一个问题:array1
是否总是有“full”如果array2
具有array1
不具有的值,那么数据,或者反过来是一种可能性吗?理解,尽管我仍然相信我评论中的问题将为我们提供一些重要信息。您说过一个数组是另一个数组的子集,这让我相信永远不会有array2的情况e> 有array1
没有的数据。这是正确的吗?修复了,这是一个输入错误。我对子集的理解不是太好,我的意思是array2
永远不会大于array1
。因此它在数组中的项数可能相同,也可能更少。但是,它永远不会有更多。这些名称就是我narray2
也将始终位于array1
中。因此array2
不能包含不在array1
中的内容。如果这有意义的话?谢谢,这在我现有的代码中非常有效!