2017-11-07 3 views
0

Ich habe eine Reihe von verschiedenen Übungen:Erstellen Sie ein Array aus Werten im Schlüssel/Wert-Objekt?

exercises: { 
    push: ['Push up', 'Bench press'], 
    legs: ['Squat', 'Power squats'], 
    pull: ['Pull up', 'Chin up'], 
    cardioCore: ['Running high knees', 'Plank'] 
} 

Wie kann ich alle diese in ein einziges Array oder Objekt kombinieren? Ich muss dies zu erstellen:

Ich werde auch alphabetisch sortieren, so dass die Reihenfolge nicht wichtig ist.

Ich glaube, ich dies wie dies mit einem forEach, etwas tun könnte:

let allExercises = []; 
exercises.forEach(exerciseGroup=>{ 
    allExercises.push(exerciseGroup); 
}); 

Aber das fühlt sich ein bisschen chaotisch. Gibt es eine schönere ES6-Lösung?

+0

Verwenden Sie '.concat()'. – PHPglue

Antwort

2

Ja, verwenden Sie einfach Object.values und Array.prototype.reduce.

const allExercises = Object.values(exercises) 
    .reduce((array, subarray) => array.concat(subarray), []); 
+1

Persönliche Präferenz, aber statt '.concat' Funktion, kann man auch den' ... '(Spread) -Operator –

+0

Auch ist' Object.values' Teil von ES6 oder ES7, nur neugierig –

+0

@AyushGupta Hm ... es ist eigentlich ES8, aber es kann leicht polygefüllt oder durch eine "Object.keys" -Ansatz ersetzt werden. – Xufox

0
[].concat.apply([], Object.values(exercises)); 
+0

Was ist die Notwendigkeit für' .join (','). Split (',') '? – stealththeninja

+0

'.join' verbindet verschachtelte Arrays, als wären sie flach. "[[1,2,3], [2,3,4], 5] .join (',')" wird "1,2,3,2,3,4,5" – Prasanna

+0

@Xufox ja gewonnen Funktioniert nicht, wenn in der Übung ein Komma vorhanden ist – Prasanna

0

Meine hässliche Lösung:

let combineExercises = []; 

    Object.values(allExercises).forEach((exerciseGroup) => { 
    exerciseGroup.forEach((exercise) => { 
     combineExercises.push(exercise) 
    }) 
    }); 

    console.log(combineExercises); 
0

können Sie verwenden Object.values & spread operator

var exercises = { 
 
    push: ['Push up', 'Bench press'], 
 
    legs: ['Squat', 'Power squats'], 
 
    pull: ['Pull up', 'Chin up'], 
 
    cardioCore: ['Running high knees', 'Plank'] 
 
} 
 
var allexercise ={},tempArray=[]; 
 
for(var keys in exercises){ 
 

 
    tempArray.push(...Object.values(exercises[keys])) 
 
} 
 
allexercise=tempArray; 
 

 
console.log(allexercise)

2

Hier ist eine andere Art und Weise, ES6 kompatibel .:

Object.getOwnPropertyNames(exercises) 
.reduce((allExercises, exerciseName) => [...allExercises, ...(exercises[exerciseName])], []) 

Wie @stealththeninja sagte, können Sie auch tun dies eine Reihe von Overhead zu reduzieren.

Object.getOwnPropertyNames(exercises).reduce((allExercises, exerciseName) => { 
    allExercises.push(...exercises[exerciseName]); 
    return allExercises; 
}, []); 
+0

'[... alle, ... Übungen [Name]' gibt jedes Mal ein neues Array zurück. Reduce übergibt das Objekt (oder Array) als Referenz, warum nicht die Elemente hinzufügen und 'all' zurückgeben? 'all.push (... Übungen [Name]); return all; ' – stealththeninja

+0

Sie könnten, ich bevorzuge nur den Spread-Ansatz. Ein Liner kehrt sauberer zurück. –

+0

'Ein Liner kehrt sauberer zurück. 'Cleaner syntaktisch, aber verschwenderisch, ein neues Array für jeden Eigenschaftsnamen zu erstellen. – stealththeninja

Verwandte Themen