2016-08-05 26 views
-1

Ich versuche Fehlermeldungen zu interpolieren, weil ich sie in einem speziellen Textformat brauche. Was ist die beste Praxis, die das heutzutage macht :) danke für jede Hilfe!ES6 Wie konvertiert man Schlüssel, Wertpaar rekursiv in Javascript?

http://codepen.io/radosch/pen/wWYPYG?editors=1111

gewünschte Ergebnis:

Password longer then 5 chars \n 
Email has invalid format \n 

Quelle:

let data = { 
    "errors": [ 
    { 
     "password": "must min have 5 characters" 
    }, 
    { 
     "email": "has invalid format" 
    } 
    ] 
} 

mögliche Lösung:

let res = data.errors.map(function(error, index) { 
    let keyName = Object.keys(error) 
    let str = error[keyName] 
    return keyName + " " + str ; 
}); 

console.log(res.join("\n")); 
+0

* nowdays * wie willst du? Deine Frage ist unklar. Bitte definieren Sie das Problem. –

+0

'Object.keys' gibt ein Array zurück. Sie versuchen, dieses Array als einen Index in "Fehler" zu verwenden? –

+0

OT Personal: @BhojendraNepal welches Problem genau hast du. Verkleinerungsrate? Wie Sie unten lesen können, ist es ein Problem, nur hacken, ohne zu wissen, was beste Praxis jetzt ist. Sie könnten konstruktiver sein, aber nur kritisieren und ablehnen. Das ist peinlich und nicht nett für Neulinge. – radosch

Antwort

1

Beachten Sie, dass ES6 Funktionen sehr langsam (zumindest auf NodeJS) (but not only) sind, so würde ich verwenden noch ES5 Funktionen, wie

var res = ''; 
for (let i = 0; i < data.errors.length; i++) { 
    var key = Object.keys(data.errors[i])[0]; 
    res += key + ' ' + data.errors[i][key] + '/n'; 
} 

Benchmark:

question x 189,765 ops/sec ±1.39% (82 runs sampled) 
maxx answer x 267,565 ops/sec ±0.98% (80 runs sampled) 
for keys x 1,735,444 ops/sec ±0.85% (82 runs sampled) 
Fastest is for keys 

Der Test:

"use strict"; 
var Benchmark = require('benchmark'); 
var suite = new Benchmark.Suite; 

suite 
.add('map', function() { 
let data = { 
    "errors": [ 
    { 
     "password": "must min have 5 characters" 
    }, 
    { 
     "email": "has invalid format" 
    } 
    ] 
} 

let res = data.errors.map(function(error, index) { 
    let keyName = Object.keys(error) 
    let str = error[keyName] 
    return keyName + " " + str ; 
}); 
res = res.join("\n"); 
}) 
.add('maxx answer', function() { 
let data = { 
    "errors": [ 
    { 
     "password": "must min have 5 characters" 
    }, 
    { 
     "email": "has invalid format" 
    } 
    ] 
} 
data.errors.map(error => Object.keys(error).map(key => `${key} ${error[key]}`)).join('\n'); 

}) 
.add('for keys', function() { 
let data = { 
    "errors": [ 
    { 
     "password": "must min have 5 characters" 
    }, 
    { 
     "email": "has invalid format" 
    } 
    ] 
} 

var res = ''; 
for (let i = 0; i < data.errors.length; i++) { 
    var key = Object.keys(data.errors[i])[0]; 
    res += key + ' ' + data.errors[i][key] + '/n'; 
} 
}) 
// add listeners 
.on('cycle', function(event) { 
    console.log(String(event.target)); 
}) 
.on('complete', function() { 
    console.log('Fastest is ' + this.filter('fastest').map('name')); 
}) 
// run async 
.run({ 'async': true }); 
+0

omg, das ist eine gute Antwort! Thnx viel! Leider ist es wie immer, Sie tauschen Leistung für Lesbarkeit. – radosch

1

So ähnlich?

data.errors.map(error => Object.keys(error).map(key => `${key} ${error[key]}`)).join('\n'); 
+0

Perfekt! Vielen Dank! obwohl ich es mit mehrzeilig verwenden, für bessere Lesbarkeit – radosch