我有2个大数据阵列。第一个数组的数据包含对第二个数组元素的一些引用。但是这个引用是initialy null,我们只有元素的id(Guid不是数组中的索引)。
最小化的例子:
var A = [{
idA: "113b9035-5f99-40c6-83cc-01e4bbf306e1",
idB: "fccee5fb-c6ce-4bdf-b9ae-31d15df9c97d",
B: null
},
...
];
var B = [{
idB: "fccee5fb-c6ce-4bdf-b9ae-31d15df9c97d"
},
...
];
我想把B放在A.B上(原因在后面解释)。
我创建了一个方法:
lierDonnees = function<TA,TB> (
listeDestination: TA[],
idDestination: string,
lienDestination: string,
listeSource: TB[],
idSource: string ): void {
listeDestination.forEach(( itemDestination: TA ) => {
var result = $.grep( listeSource, function ( itemSource: TB ) {
return itemSource[idSource] === itemDestination[idDestination];
});
if ( result.length > 0 ) {
itemDestination[lienDestination] = result[0];
}
});
};
这个功能的复杂性是: (listeDestination.length)*(listeSource.length)
所以我们说N²。
我的问题是:你看到更快的方式吗?
现在让我们谈谈“为什么”。
我有一个提供此数据的REST Web服务(ASP.NET WebApi)。由于我有更多的“A”而不是“B”,我在发送数据之前将A.B置为null(以避免重新分配,因为很多A具有相同的B)。而且我也希望能够只访问A(没有B)。所以A和B都在不同的Web API控制器中。
总之:为了更快地获取数据,我将它们下载并分离(因此我可以优先考虑我想要的数据)。我只保留ids。所以我的前端应用程序'必须完成链接数据的工作。
编辑:Tarh解决方案
使用idB和B之间的地图。复杂性: 2N !
lierDonnees = function <TA, TB>(
listeDestination: TA[],
idDestination: string,
lienDestination: string,
listeSource: TB[],
idSource: string ): void {
var mapIdSourceItemSource: any = {};
var i: number;
for ( i = 0; i < listeSource.length; ++i )
mapIdSourceItemSource[listeSource[i][idSource]] = listeSource[i];
var itemDestination, itemSource;
for ( i = 0; i < listeDestination.length; ++i ) {
itemDestination = listeDestination[i];
itemSource = mapIdSourceItemSource[itemDestination[idDestination]];
if ( itemSource ) {
itemDestination[lienDestination] = itemSource;
}
}
};
答案 0 :(得分:2)
将对象用作地图:
// First, fill bMap
var bMap = {};
for (var i = 0; i < B.length; ++i)
bMap[B[i].idB] = B[i];
// Then, use it
var a, b;
for (var i = 0; i < A.length; ++i) {
a = A[i];
b = bMap[a.idB]
if (b) {
// Do something here
}
}