2017-05-27 2 views
-1

Ziel des Codes ist, ein neues Array zu erstellen, das alle Beschriftungen mit einer numerischen Komponente von 10 oder größer in einem einzelnen Objekt mit der Bezeichnung V10+ kombiniert. Der neue Objektwert ist der Wert des größten Labels.Vermeiden Sie mehrere Arrays in JavaScript

Im folgenden Beispiel war V13 das größte Label deshalb seinen Wert verwendet werden:

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

Derzeit find, ich habe map dann reduce auf dem Array zu verwenden. Hat jemand einen Vorschlag, dies zu vereinfachen?

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

bitte posten Sie hier Ihren Code – brk

+1

Sie könnten versuchen, auch das Ziel des Codes zu erklären. –

Antwort

0

könnten Sie in der Lage sein, sich durch die Anordnung mit einer einzigen Iteration zu erhalten. Versuchen Sie, diese nach Ihrer Definition von 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

Es ist möglich, dies in einer einzigen Iteration zu erreichen, wenn Ihr bereit, Ihre Funktionen höherer Ordnung zu opfern. Behalten Sie einfach die maximalen Werte im Auge und erstellen Sie das neue Array im laufenden Betrieb. Danach können Sie die V10+ mit dem maximalen Wert auf das Array drücken.

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

Dies setzt voraus, dass es Einträge gibt, die größer als 10 sind. Was ist, wenn das Array someObjects keine V10 oder V11 usw. hat? Dadurch wird unabhängig davon ein Eintrag in das Ergebnis eingefügt. – pacifier21

Verwandte Themen