我有一组数字显示如下;
Fragment-A
每个数字代表一个x / y坐标,我想在每个数字旁边添加一个值,该值是根据范围内数字的频率计算的。
所以,我希望能够将每个值与该字符串中的所有其他值进行比较,并从中执行以下函数;
因此,使用数据字符串,它将被转换为;
var data = "615:415,600:400,600:400,300:300"
我一直在尝试使用减速器功能,但我主要是在第2步中挣扎。我希望有人可以提供帮助吗?
谢谢 - Code + Plunk下面!
http://plnkr.co/edit/zPW1844cLnUFAlEI77jq?p=preview
var data = "615:415:1, 600:400:2, 300:300:0"

答案 0 :(得分:1)
您可以使用循序渐进的方法,首先在坐标中拆分字符串,为带有计数的坐标生成哈希表,并仅过滤唯一的坐标。
然后将每个唯一坐标相互比较,并计算是否在给定范围内。
稍后使用计数映射坐标并连接到字符串。
var data = "615:415,600:400,600:400,300:300",
result = function (array) {
var i, j,
hash = Object.create(null),
unique = array.split(',').filter(function (a) {
var parts = a.split(':');
if (!hash[a]) {
hash[a] = [parts[0], parts[1], 0]; // [x, y, count]
return true;
}
hash[a][2]++;
});
for (i = 0; i < unique.length - 1; i++) {
for (j = i + 1; j < unique.length; j++) {
if (
Math.abs(hash[unique[i]][0] - hash[unique[j]][0]) <= 15 &&
Math.abs(hash[unique[i]][1] - hash[unique[j]][1]) <= 15
) {
hash[unique[i]][2]++;
hash[unique[j]][2]++;
}
}
}
return unique.map(function (a) {
return hash[a].join(':');
}).join(', ');
}(data);
console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
这是另一种选择:
var data = "615:415,600:400,600:400,300:300";
var result = (function (s) {
var result = {};
var values = [];
// Process each value
s.split(',').forEach(function (v) {
var b = v.split(':');
// If a match, increment count by 2 (once for match and again for within 15)
if (result[v]) {
result[v].count += 2;
// Otherwise, just check for within 15
} else {
result[v] = {x:b[0], y:b[1], count:0};
values.forEach(function(xy, i){
if (xy[0]>= (b[0]-15) && xy[0] <= (+b[0]+15) &&
xy[1]>= (b[1]-15) && xy[1] <= (+b[1]+15) ) {
++result[xy.join(':')].count; // Increment for nearby only
}
})
values.push([b[0],b[1]]);
}
})
// Create required string format
return Object.keys(result).reduce(function(arr, key){
arr.push(key + ':' + result[key].count);
return arr;
},[]).join(', ');
})(data)
console.log(result);
&#13;
答案 2 :(得分:0)
到目前为止,所有答案都很好。我只想通过发明Array.prototype.withEachOther()
方法来介绍一些变化。只需要一个回调就可以调用回调,其中数组的每个其他项都是你可能建议的参数。它的工作原理。
Array.prototype.withEachOther = function(cb){
this.map(function(e,i,a){
var t = a.slice();
t.splice(0,i+1);
t.map(function(f){
a[i] = cb(e,f);
});
});
return this;
};
var data = "615:415,600:400,600:400,300:300, 550 : 550".split(/\s*,\s*/)
.map(s => s.split(/\s*:\s*/).concat(0)),
cb = (f,s) => (Math.abs(f[0]-s[0]) <= 15 && Math.abs(f[1]-s[1]) <= 15 && (f[2]++, s[2]++),f);
result = data.reduceRight(function(p,c,i,a){
var fi = a.slice(0,i-a.length)
.findIndex(f => f[0] === c[0] && f[1] === c[1]);
fi !== -1 ? (a[fi][2] += ++c[2], a.splice(i,1))
: p.push(c);
return p;
},[])
.withEachOther(cb)
.reduce((p,c) => p += c[0]+":"+c[1]+":"+c[2]+", ","");
console.log(result);
&#13;