如何比较数组中的每个数字? (JavaScript的)

时间:2016-12-07 09:03:33

标签: javascript sorting

我有一组数字显示如下;

Fragment-A

每个数字代表一个x / y坐标,我想在每个数字旁边添加一个值,该值是根据范围内数字的频率计算的。

所以,我希望能够将每个值与该字符串中的所有其他值进行比较,并从中执行以下函数;

  1. 如果字符串重复,请从字符串中删除该编号,然后添加:1
  2. 如果x / y数字与任何其他数字的范围均为15,请添加:1
  3. 如果没有匹配项,请添加:0
  4. 转入阵列
  5. 因此,使用数据字符串,它将被转换为;

    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"
    
    
    

3 个答案:

答案 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;
&#13;
&#13;

答案 1 :(得分:1)

这是另一种选择:

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

到目前为止,所有答案都很好。我只想通过发明Array.prototype.withEachOther()方法来介绍一些变化。只需要一个回调就可以调用回调,其中数组的每个其他项都是你可能建议的参数。它的工作原理。

&#13;
&#13;
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;
&#13;
&#13;