2017-05-27 17 views
-1

コードの目的は、数値コンポーネントが10以上のすべてのラベルを、ラベルがV10+の単一のオブジェクトに結合する新しい配列を生成することです。新しいオブジェクトの値は、最大のラベルの値になります。次の例ではJavaScriptで複数の配列トラバーサルを避ける

V13が最大のラベルので、その値が使用されますされた:

[{'V10', 11}, {'V11', 123}, {'V12', 112}, {'V13', 120}] => {'V10+', 120}

を現在、私は、アレイ上findmapその後、reduceを使用する必要があります。誰かがこれを簡略化するための提案を持っていますか?

var someObjects = [ 
 
    {'label': 'VS', 'value': 1 }, 
 
    {'label': 'V1', 'value': 2 }, 
 
    {'label': 'V2', 'value': 3 }, 
 
    {'label': 'V3', 'value': 4 }, 
 
    {'label': 'V4', 'value': 5 }, 
 
    {'label': 'V5', 'value': 6 }, 
 
    {'label': 'V6', 'value': 7 }, 
 
    {'label': 'V7', 'value': 8 }, 
 
    {'label': 'V8', 'value': 9 }, 
 
    {'label': 'V9', 'value': 10 }, 
 
    {'label': 'V10', 'value': 11 }, 
 
    {'label': 'V11', 'value': 123 }, 
 
    {'label': 'V12', 'value': 112 }, 
 
    {'label': 'V13', 'value': 120 }, 
 
    {'label': 'VE', 'value': 13 } 
 
]; 
 

 
var maxObjVal = someObjects.find(function(obj) { 
 
    var max = Math.max.apply(null, someObjects.map(function (s) { 
 
     var labelNumber = s.label.substring(1); 
 
     return +labelNumber || 0; 
 
    })); 
 

 
    return obj.label == 'V' + max; 
 
}).value; 
 

 
var result = someObjects.reduce(function (ten) { 
 
     return function (r, a) { 
 
      var n = +a.label.substring(1); 
 
      if (n >= 10) { 
 
       if (!ten) { 
 
        ten = { label: 'V10+', value: maxObjVal }; 
 
        r.push(ten); 
 
       } 
 
      } else { 
 
       r.push(a); 
 
      } 
 
      return r; 
 
     }; 
 
    }(), []); 
 

 
console.log('result: ' + JSON.stringify(result));

+1

ここにあなたのコードを投稿してください – brk

+1

あなたにも、コードの目的を説明してみてください可能性があります。 –

答えて

0

あなたは、配列を1回の繰り返しで逃げることができるかもしれません。 someObjectsのあなたの定義の後にこれを試してみてください:

var resultArray = []; 
var tenObj = null; 
var maxVal; 

someObjects.forEach(function (s) { 
    // Get the number from the label (if possible) 
    var labelNumber = s.label.substring(1); 
    labelNumber = +labelNumber || 0; 

    // Update the maxVal 
    maxVal = maxVal ? Math.max(maxVal, s.value) : s.value; 

    // Check for a label number >= 10 
    if (labelNumber >= 10) { 
     if (!tenObj) { 
      tenObj = { label: 'V10+', value: 0}; // We'll set this value later 
      resultArray.push(tenObj); 
     } 
    } else { 
     resultArray.push(s); 
    } 
})); 

// Update the value of the tenObj 
if (tenObj) { 
    tenObj.value = maxVal; 
} 
0

あなたの高階関数を犠牲にするあなたの意思があれば、単一の反復でこれを実現することが可能です。最大値を追跡して、新しい配列を作成してください。その後、V10+を最大値で配列にプッシュできます。

var someObjects = [ 
 
    {'label': 'VS', 'value': 1 }, 
 
    {'label': 'V1', 'value': 2 }, 
 
    {'label': 'V2', 'value': 3 }, 
 
    {'label': 'V3', 'value': 4 }, 
 
    {'label': 'V4', 'value': 5 }, 
 
    {'label': 'V5', 'value': 6 }, 
 
    {'label': 'V6', 'value': 7 }, 
 
    {'label': 'V7', 'value': 8 }, 
 
    {'label': 'V8', 'value': 9 }, 
 
    {'label': 'V9', 'value': 10 }, 
 
    {'label': 'V10', 'value': 11 }, 
 
    {'label': 'V11', 'value': 123 }, 
 
    {'label': 'V12', 'value': 112 }, 
 
    {'label': 'V13', 'value': 120 }, 
 
    {'label': 'VE', 'value': 13 } 
 
]; 
 

 
result = []; 
 
// Will keep track of max label and value. e.g. [13, 120] 
 
maxValue = [0, 0]; 
 

 
let getNumbers = (s) => { return +s.substring(1) || 0 }; 
 

 
someObjects.forEach(function(element) { 
 
    if (element.hasOwnProperty("label")) { 
 
     let number = getNumbers(element["label"]); 
 
     if (number < 10) { // Keep this object as is 
 
      result.push(element) 
 
     } else { 
 
      if (number > maxValue[1]) { // Check for a new max 
 
       maxValue[0] = element["value"]; 
 
       maxValue[1] = number 
 
      } 
 
     } 
 
    } 
 
}); 
 
// Finally push the aggregated label and max value to the array. 
 
result.push({"label": 'V10+', 'value': maxValue[0]}); 
 
console.log(result);

+0

これは、10を超えるエントリがあることを前提としています。someObjects配列にV10やV11などがない場合はどうなりますか?これは結果に関係なくエントリを追加します。 – pacifier21

関連する問題