2个阵列之间的链接

时间:2015-03-24 11:06:01

标签: javascript algorithm typescript

我有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)

所以我们说

我的问题是:你看到更快的方式吗?

现在让我们谈谈“为什么”。

我有一个提供此数据的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;
            }
        }
    };

1 个答案:

答案 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
    }
}