2016-12-23 22 views
0

は、私は次の配列変換したいと思います「データ」配列変換ネストされたオブジェクト

[ 
    { time: "less_length_than_allowed <br> wrong_format"}, 
    { age: "too_young <br> not_enough_information"}, 
] 

が、私は基本的に文字列を削除したいの各フィールド属性に対してオブジェクトキーとしての共通フィールドと値のメッセージの連結を使用して、配列をマージします。

これは私がこれまで持っているものです。

var removedData = errors.map(item => { 
    item.field = item.field.slice(5); 
    return item 
}); 

var computedErrors = _.chain(removedData).groupBy('field').value(); 
+0

FYI - あなたの最初のスクリプトは実際に 'errors'配列も実際に変更します –

+0

エラーが修正されても問題ありません:) – Joelito

+1

なぜ' time: '結果にアンダースコアがありますが' age: '結果にはありませんか? –

答えて

0

あなたがそうのようにそれを行うことができます。

var age = []; 
var time = []; 
var removedData = errors.forEach(element => { 
if(element.field.contains('time')){ time.push(element.message); } 
if(element.field.contains('age')){ age.push(element.message); } 
}); 

var removedData = { 
age: age.join('<br>'), 
time: time.join('<br>'), 
}; 
1

あなたは次の結果を返すために、プレーンJSでreduce()を使用することができます。

let errors = [{ 
 
    field: "data.time", 
 
    message: "less length than allowed" 
 
}, { 
 
    field: "data.time", 
 
    message: "wrong format" 
 
}, { 
 
    field: "data.age", 
 
    message: "too young" 
 
}, { 
 
    field: "data.age", 
 
    message: "not enough information" 
 
}]; 
 

 
var o = {} 
 
var result = errors.reduce(function(r, e) { 
 
    var key = e.field.split('.')[1]; 
 
    var message = e.message.replace(/\s/g, '_'); 
 

 
    if (!o[key]) { 
 
    o[key] = {[key]: message} 
 
    r.push(o[key]) 
 
    } else { 
 
    o[key][key] += ' <br> ' + message 
 
    } 
 
    return r; 
 
}, []) 
 

 
console.log(result)

+0

'var key = e.field.split( '。') [1]; ' –

+0

@Jaromanda Xはい、ありがとうございます。 –

+0

また、 'e.message'はスペースを' _'で置き換える必要があります... 'o [key] = {[key]:e.message.replace(/ \ s/g、 '_');' –

0

let errors = [{ 
 
    field: "data.time", 
 
    message: "less length than allowed" 
 
}, { 
 
    field: "data.time", 
 
    message: "wrong format" 
 
}, { 
 
    field: "data.age", 
 
    message: "too young" 
 
}, { 
 
    field: "data.age", 
 
    message: "not enough information" 
 
}]; 
 

 
var mappedData = errors.reduce((result, currentValue) => { 
 
    let type = currentValue.field.split(/\./).pop(), 
 
    message = currentValue.message.replace(/\s/g, "_") 
 

 
    if (typeof result[type] === "undefined") { 
 
    result[type] = message 
 
    } else { 
 
    result[type] += " <br> " + message; 
 
    } 
 

 
    return result; 
 
}, {}); 
 

 
console.log(mappedData);

0
_.chain(errors) 
    .groupBy('field') // group errors by field 
    .mapValues(function(items, key) { // iterate grouped arrays 
     return _.chain(items) 
      .map('message') // get message value from each item 
      .join('<br>') // join messages 
      .thru(function(str) { 
       return _.set({}, key.replace(/data./g, ''), str); // transform to object 
      }) 
      .value(); 
    }) 
    .values() // get object values 
    .value(); 
0

const errors = [{"field":"data.time","message":"less length than allowed"},{"field":"data.time","message":"wrong format"},{"field":"data.age","message":"too young"},{"field":"data.age","message":"not enough information"}]; 
 

 
const result = _(errors) 
 
    .groupBy(({ field }) => field.split('.')[1]) 
 
    .mapValues((group) => 
 
    group.map(({ message }) => _.snakeCase(message)) 
 
    .join(' <br> ') 
 
) 
 
    .map((value, key) => ({ [key]: value })) 
 
    .value(); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.3/lodash.min.js"></script>

関連する問題