我正在使用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);
}
});
答案 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(){}
}
*/
});
});
更新了我的范围功能以排除重复项。