2017-03-28 3 views
0

多角形内の点も探しています。入れ子のforとスプライスを使用するJavascript

私はポイントオブジェクトとポリゴンオブジェクトの配列を持つ配列を持っています。

私は私のポイント配列を反復し、ポリゴン配列を反復し、ポイントがその配列内にあるかどうかを調べたいと思います。ポイントが配列内にある場合は、1つのポイントが1つのポリゴンにしか含まれないため、ポイント配列からポイントを削除します。

だから私は、この機能を使用しようとしました:

function pointsInPolygons(features, points) { 
    var pointCopy = $.extend(true, [], points.features); 
    for (var i = 0; i < pointCopy.length; i++) { 
     var point = pointCopy[i]; 
     for (var j = 0; j < features.features.length; j++) { 
      var feature = features.features[j]; 
      if (isPoly(feature) && gju.pointInPolygon(point.geometry, feature.geometry)) { 
       feature.properties.ratings.push(point.properties.rating); 
       pointCopy.splice(i, 1); 
       i--; 
      } 
     } 
    } 
} 

しかし、機能が残されている、ための内部を通過した後。スプライスなしでiを減らしてみました。しかしそれはまだ同じ行動です。

だから私は再びどのように外に出ることができますか?

+0

スプライスを行った時点で、内側のループから飛び出し、外側のループの次の繰り返しを続けるために「中断」したいですか? – nnnnnn

+0

はいそれは私が望むものです – dominic

+1

...私は文字通り 'if'ブロックの' i - ; '文の直後に' break; 'を追加すると言っています。 – nnnnnn

答えて

0

実際には、配列から項目を削除する必要はありません。現在のループはpointsに対して1回だけ反復処理されます。ここでは、あなたがやっていることに対する平らなアプローチがあります。

function pointsInPolygons(features, points){ 
    let pointsCopy = points.features.slice(); 
    let check = (point,feature) => isPoly(feature) && gju.pointInPolygon(point.geometry, feature.geometry); 
    let isInPolygon = point => features.find(check.bind(null, point)); 

    pointsCopy.forEach(point => { 
    let feature = isInPolygon(point); 
    if (!!feature) { 
     feature.properties.ratings.push(point.properties.rating); 
    } 
    }); 
} 
関連する問題