NodeJS:使用异步进程将数组的每个元素与所有其他元素进行比较?

时间:2017-02-09 14:06:11

标签: javascript arrays node.js

我正在使用Resemble.js来比较我的网络应用中的图片。 我得到了一系列图像(网址)。我想将图像与阵列中的每个其他图像进行比较,并计算该图像的唯一分数。 例如。 [url1,url2,url3,url4] 所以最小组合将是

1 => 2
1 => 3
1 => 4
2 => 3
2 => 4
3 => 4

但我还需要存储相反的组合值(尽管它们会相同) 例如。 1 => 2将与2 =>相同1

问题 我如何运行像

这样的循环
 for (var i = 1; i<=arr.length; i++) {
    for (var j = i+1; j <=arr.length; j++) {
        console.log(i + " => " + j);
       //async operation to compare two images
    }
}

使用Nodejs的异步模块。也没有再比较两个图像的相反组合结果。而是使用已计算的分数。

修改

MODIFIED 我现有的代码非常正常并且提供了正确的结果,而且速度也非常快。 有什么方法可以进一步优化它吗?

var arr = [ 
        {url: 'url1'}, {url:'url2'}, {url:'url3'}
    ];

    function range(length) {
        var l = [];
        var counter = 0;
        for (var i = 0; i < length; i++) {
            for (var j = 0; j < length; j++) {
                if(i != j){
                    l[counter] = {
                        i: i,
                        j: j
                    };
                    counter++;  
                }

            }
        }
        return l;
    }

    var ijs = range(arr.length);
    var tempUS = 0; 
    async.each(ijs, function (ij, cb) {
            if(ij.i != ij.j && ij.i > ij.j) {
                resemble(arr[ij.i].url).compareTo(arr[ij.j].url).onComplete(function(data) {
                   console.log(data.misMatchPercentage);
                   ij.score = data.misMatchPercentage;
                   cb();
                }); 
            }
            else {
                cb();
            }

        },
        function(err){
            if(err) {
                console.log(err);
            }
            else {
                for(var e = 0; e <arr.length; e++) {
                    var z = 0;
                    for(var f = 0; f < ijs.length; f++) {
                        if(ijs[f].i == e) {
                            if(ijs[f].score) {
                                z = z+ parseFloat(ijs[f].score);    
                            }

                        }
                        else if(ijs[f].j == e) {
                            if(ijs[f].score) {
                                z = z+ parseFloat(ijs[f].score);    
                            }

                        }
                    }
                    console.log(e, " ======== ", z);
                    var avg = z/arr.length;
                    arr[e].uniqueScore = avg;
                }
                console.log(arr);

            }
        });

1 个答案:

答案 0 :(得分:2)

如果您带入异步模块并执行:

function range(length) {
    var l = [];
    var counter = 0;
    for (var i = 0; i < length; i++) {
        for (var j = i + 1; j < length; j++) {
            l[counter] = {
                i: i,
                j: j
            };
            counter++;
        }
        counter++;
    }
    return l;
}

var ijs = range(arr.length);

async.each(ijs, function (ij, cb) {
    resemble(arr[ij.i])compareTo(arr[ij.j]).onComplete(function(data){
       // data; // do something with data
       cb(); // call the callback so we know we can move on
       /*
       {
          misMatchPercentage : 100, // %
          isSameDimensions: true, // or false
          getImageDataUrl: function(){}
       }
       */
    });
});

修改

更新了我的范围功能以排除重复项。