2016-12-07 7 views
4

私は、次のように表示される一連の番号を持っています。どのように配列のすべての数をお互いに比較するのですか? (JavaScript)

var data = "615:415,600:400,600:400,300:300"

各番号はy座標、及びIは、範囲内の数の頻度に基づいて計算されるそれぞれの次の値を追加したい/ Xを表します。

だから、私はこの文字列内の他のすべての値と比較することができたいと思います。

  1. が重複している場合は、文字列から番号を削除し、追加:1
  2. をX/Y番号が追加、任意の他の数に対する15の範囲内で両方の場合:1
  3. 一致がない場合は、追加:0
  4. 電源を入れて、アレイ

にようにデータ列を使用して、それはに変換されます。

var data = "615:415:1, 600:400:2, 300:300:0"

私は減速機能を使ってこれを実行しようとしているが、私は、誰かが助けることができる願っています主に、ステップ2で苦労していますか?

ありがとうございます - コード+以下のおしゃべり!


http://plnkr.co/edit/zPW1844cLnUFAlEI77jq?p=preview

var result = []; 
 
var data = "615:415,600:400,600:400,300:300" 
 
var count = 0; 
 

 
var reducer = function(p, c, i, a) { 
 

 
    if (p && p !== c) { 
 

 
    var _t = p.split(":"); 
 
    result.push({ 
 
     x: _t[0], 
 
     y: _t[1], 
 
     value: count 
 
    }); 
 

 
    count = 0; 
 
    if (i === a.length - 1) { 
 
     _t = c.split(":"); 
 
     result.push({ 
 
     x: _t[0], 
 
     y: _t[1], 
 
     value: count 
 
     }); 
 
    } 
 
    } 
 
    else { 
 
    count++; 
 
    } 
 
    return c 
 
} 
 

 
data.split(',').sort().reduce(reducer); 
 

 
console.log(result)

+0

_ "X/Y番号が追加、他の数に対して15の範囲内の両方ある場合:1" _なぜあなたは300 'に '0'を追加します:300: 0?なぜ '2'は' 600:400:2'に連結されていますか? – guest271314

+0

@ guest271314考えているのは、実行中のカウンタを持つことです。したがって、数値に重複がない/他の数値の範囲内にない場合は、0に設定して他の数値と比較する必要があります。それは '615:415'の範囲にあるので、 '600:400:2'です。+1を取得しますが、重複して別の+1を取得します(重複を削除したもの) – ggt

答えて

1

あなたがステップバイステップのアプローチを使用し、座標で最初の文字列を分割し、カウント数とフィルタとの座標のハッシュテーブルを生成することがありましたユニークな座標だけです。

次に、それぞれの固有の座標を互いに比較し、与えられた範囲内であれば数えます。

後でcountで座標をマップし、stringに結合します。

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

パーフェクト - ありがとう! – ggt

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);

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);

関連する問題