2017-03-23 8 views
1

私の地域の配列には、選択されたプロパティがtrueである3つのレコード、すなわち14.3,14.2,11.1があります。レコードの各グループからmax idでプロパティの値を保持する方法は?

selectedプロパティがtrueのパーツのすべての下位バージョンでselectedプロパティをfalseに設定しようとしています。

たとえば、14.3と14.2が選択され、14.3のidが14.2より大きいので、part = 30の場合、14.2の選択プロパティは、選択された14.3と14.2からpart = 30の下位バージョンであるためfalseに設定する必要があります。 。

11.1について言えば、上位バージョンは11.1だけです。なぜなら、11.1が選択されていない11.2が選択されていないため、11.1の選択されたプロパティは真に残りますからです。

予想される出力:私は最大のidのためにtrueに選択したプロパティを維持するためにどのようになっていない午前、各パートのだから、

var regions = [ 
       { 
        "id": 77, 
        "selected": false, 
        "part": 33, 
        "name": "16.1", 
       }, 
       { 
        "id": 76, 
        "part": 30, 
        "selected": true, 
        "name": "14.3", 
       }, 
       { 
        "id": 71, 
        "part": 30, 
        "selected": false, 
        "name": "14.2", 
       }, 
       { 
        "id": 70, 
        "part": 31, 
        "selected": false, 
        "name": "15.1", 
       }, 
       { 
        "id": 54, 
        "part": 25, 
        "selected": false, 
        "name": "11.2", 
       } 
       , 
       { 
        "id": 53, 
        "part": 25, 
        "selected": true, 
        "name": "11.1", 
       } 
      ]; 

var regions = [ 
 
       { 
 
        "id": 77, 
 
        "selected": false, 
 
        "part": 33, 
 
        "name": "16.1", 
 
       }, 
 
       { 
 
        "id": 76, 
 
        "part": 30, 
 
        "selected": true, 
 
        "name": "14.3", 
 
       }, 
 
       { 
 
        "id": 71, 
 
        "part": 30, 
 
        "selected": true, 
 
        "name": "14.2", 
 
       }, 
 
       { 
 
        "id": 70, 
 
        "part": 31, 
 
        "selected": false, 
 
        "name": "15.1", 
 
       }, 
 
       { 
 
        "id": 54, 
 
        "part": 25, 
 
        "selected": false, 
 
        "name": "11.2", 
 
       } 
 
       , 
 
       { 
 
        "id": 53, 
 
        "part": 25, 
 
        "selected": true, 
 
        "name": "11.1", 
 
       } 
 
      ]; 
 
      var obj = { "id": 70,"part": 31, "selected": true,"name": "15.1" }; 
 
      
 
      for (var i = 0; i < regions.length; i++) { 
 
      if ((regions[i].part != obj.part 
 
         && regions[i].selected)) 
 
      { 
 
        regions[i].selected = false; //this set 14.3 and 11.1 selected to false. 
 
      } 
 
} 
 
    
 
console.log(regions)

+0

あなたのロジックは本当に明確 – Weedoze

+0

@Weedozeではありません:あなたは明らかではないが、どの部分を教えてくださいことはできますか? –

答えて

1

あなたは(idを選択した最大のpart sからマップを構築するために)reduceのようなこのArrayメソッドを使用して行うことができますforEach(各領域の最大値がidであるかどうかによって、各領域の値をselectedの値に更新します)。

var regions = [{ 
 
    "id": 77, 
 
    "selected": false, 
 
    "part": 33, 
 
    "name": "16.1", 
 
    }, 
 
    { 
 
    "id": 76, 
 
    "part": 30, 
 
    "selected": true, 
 
    "name": "14.3", 
 
    }, 
 
    { 
 
    "id": 71, 
 
    "part": 30, 
 
    "selected": true, 
 
    "name": "14.2", 
 
    }, 
 
    { 
 
    "id": 70, 
 
    "part": 31, 
 
    "selected": false, 
 
    "name": "15.1", 
 
    }, 
 
    { 
 
    "id": 54, 
 
    "part": 25, 
 
    "selected": false, 
 
    "name": "11.2", 
 
    }, 
 
    { 
 
    "id": 53, 
 
    "part": 25, 
 
    "selected": true, 
 
    "name": "11.1", 
 
    } 
 
] 
 

 
var map = regions.reduce(function (map, e) { 
 
    if (e.selected) map[e.part] = Math.max(map[e.part] || 0, e.id) 
 
    return map 
 
}, {}) 
 

 
console.log(map) 
 

 
regions.forEach(function (e) { 
 
    if (e.part in map) e.selected = e.id === map[e.part] 
 
}) 
 

 
console.log(regions)

+0

これはうまくいきました。私を助けるためのあなたの親切な努力にとても感謝しています。 –

2

あなたが二回配列を反復処理できます。

var maxes = {}; 

// keep track of the max value associated with each id 
for (var i = 0; i < regions.length; i++) { 
    var id = regions[i].part; 
    if (typeof maxes[id] === 'undefined') 
     maxes[id] = +regions[i].name; 
    else maxes[id] = Math.max(maxes[id], +regions[i].name); 
} 

// set the max to be true and all others to be false 
for (var i = 0; i < regions.length; i++) { 
    if (+regions[i].name === maxes[regions[i].part]) 
     regions[i].selected = true; 
    else 
     regions[i].selected = false; 
} 
+0

答えを最適化して単一のループで作業することは可能ですか? –

+0

本当にありません。各パーツの最大値を知っていなければならず、配列の終わりに達するまでこれを行うことはできません。 – jhhayashi

+0

maxesは配列でなければなりませんが、オブジェクトとして取っています –

関連する問題