2017-05-27 32 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

你也許能夠逃脫通過數組一個迭代。在你定義了一些對象後試試這個:

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