2015-06-29 18 views
7

Deshalb möchte ich konvertieren:in Javascript reduzieren

Von:

{ 
    emailNotify: { 
    EQ: true 
    }, 
    foo: { 
    bar: false 
    } 
} 

Um:

[ 
    {'condition': 'EQ', 'attribute': emailNotify, 'value': true}, 
    {'condition': 'bar', 'attribute': foo, 'value': false} 
] 

ich den folgenden Code versucht:

var fromObj={ 
    emailNotify: { 
     EQ: true 
    }, 
    foo: { 
     bar: false 
    } 
}; 

console.log(Object.keys(fromObj)); 
var result = (Object.keys(fromObj)).reduce(function(p,c,i,a){ 
    var newObj={}; 
    newObj["condition"]=Object.keys(fromObj[c])[0]; 
    newObj["attribute"]=c; 
    newObj["value"]=fromObj[c][Object.keys(fromObj[c])[0]]; 
    p.push(newObj); 
    return p; 
},[]); 


console.log("result", result); 

Ist das so, wie Sie es auch tun würden? Ich glaube ich benutze Reduce nicht richtig?

PS: Ich bekomme das richtige Ergebnis! Wollte nur wissen, ob es der elangante Weg ist oder nicht?

+1

Wenn diese Objekte mehr als eine Eigenschaft haben, gibt es keine Garantie, die von Ihnen als Eigentum bekommen 0. – Pointy

+0

Sie immer eine haben Eigentum; Ich hasse 'fromObj [c] [Object.keys (fromObj [c]) [0]]' though! – user385729

+2

Speichern Sie das Ergebnis des Aufrufs von 'Object.keys (fromObj [c]) [0]', anstatt es mehrmals aufzurufen. Fügen Sie einfach noch eine 'var' hinzu. – Pointy

Antwort

10

Es kann einfacher sein, mit Array.prototype.map:

var fromObj={ 
 
    emailNotify: { 
 
     EQ: true 
 
    }, 
 
    foo: { 
 
     bar: false 
 
    } 
 
}; 
 

 
var result = Object.keys(fromObj).map(function(key) { 
 
    var subObj = Object.keys(fromObj[key]); 
 
    return { 
 
     condition: subObj[0], 
 
     attribute: key, 
 
     value: fromObj[key][subObj[0]] 
 
    }; 
 
}); 
 

 
alert(JSON.stringify(result, null, 4));

+1

@pasargad Beide Ansätze sind gut und ich sehe nicht jede Vorliebe ... –