2017-08-16 16 views
1

タイトルが自明であることを願っていますが、私が作成したフィドルで明確にしようとします。 2つの配列があります。ひとつはタグと呼ばれ、私は現在持っているもので、tags_idealは本当に実現したいものです。オブジェクトの配列を同じオブジェクトのパラメータに減らしてください

現在の状態:

var tags = [ 
    { 
    id: 1, 
    color: 'red', 
    l10n: [ 
     { 
     name: 'Something something', 
     lang: 'english' 
     }, 
     { 
     name: 'Etwas etwas', 
     lang: 'deutsch' 
     } 
    ] 
    }, 
    { 
    id: 2, 
    color: 'blue', 
    l10n: ... 
    } 
] 

私は後だ何:

var tags_ideal = [ 
    { 
    id: 1, 
    color: 'red', 
    l10n: { 
     'english': { 
     name: 'Something something', 
     }, 
     'deutsch': { 
     name: 'Etwas etwas', 
     } 
    } 
    }, 
    { 
    id: 2, 
    color: 'blue', 
    l10n: ... 
    } 
] 

私は最初のケースを持っており、彼らはLANGを持っていないように、ローカライゼーションからすべてのものを変換したいです:英語のパラメータではなく、englishという名前のオブジェクトとその中の名前/タイトルがあります。両方のタグの下には、私がやろうとしたことと、その中にl10nオブジェクトだけを渡すときに動作するものがありますが、全体的なものではありません(なぜ、私は本当に後のことをやっているのか分かります)。

また、この時点で私の配列が正しくないことに注意してください。次のオブジェクトの先頭に3つの点を追加して、配列内に複数のオブジェクトがあることを指摘しました。 https://jsfiddle.net/cgvpuj70/

答えて

1

使用.reduce()現在のアレイ内の各オブジェクトに由来するキー/値が移入オブジェクトを作成します。

var tags = [ 
 
    { 
 
    id: 1, 
 
    color: 'red', 
 
    l10n: [ 
 
     { 
 
     name: 'Something something', 
 
     lang: 'english' 
 
     }, 
 
     { 
 
     name: 'Etwas etwas', 
 
     lang: 'deutsch' 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    id: 2, 
 
    color: 'blue' 
 
    } 
 
] 
 

 
tags.forEach(t => { 
 
    t.l10n = t.l10n && t.l10n.reduce((o, data) => 
 
    Object.assign(o, {[data.lang]: {name: data.name}}) 
 
    , {}) 
 
}) 
 

 
console.log(tags);

+0

恐ろしい!魅力のように動作します。 – twenty

+0

うれしかったよ! – spanky

2

あなたは外側の配列を反復処理し、内側の配列のための新しいオブジェクトをマッピングすることができます:

はここでフィドルです。 l10n

var tags = [{ id: 1, color: 'red', l10n: [{ name: 'Something something', lang: 'english' }, { name: 'Etwas etwas', lang: 'deutsch' }] }, { id: 2, color: 'blue', l10n: [] }]; 
 

 
tags.forEach(a => a.l10n = a.l10n.map(b => ({ [b.lang]: { name: b.name } }))); 
 

 
console.log(tags);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

オブジェクト全体を翻訳することができます方法ですそれはeslinterをバイパスするために何かを変更することなく動作するので、spankyの答えは正しいと思います。どうもありがとう! – twenty

0

あなたがしなければならないのは、空のオブジェクトを作成し、それを埋めるです。まず、新しいオブジェクトを作成します。次に、配列l10nの各要素に対して、object[element.lang]element.nameに設定します。これで新しいjson構造が完成しました。

function translate(title) { 
    var object = {}; 
    for (var i=0; i<title.length; i++) { 
    var element = title[i]; 
    object[element.lang] = element.name; 
    } 
    return object; 
} 

編集:

は、ここで修正translate機能ですここでは、私は以下のように同じ結果を取得していますが、私がマークした

var newTags = []; 
for (var i=0; i<tags.length; i++) { 
    var edited = {}; 
    edited.id = tags[i].id; 
    edited.color = tags[i].color; 
    edited.l10n = translate(tags[i].l10n); 
    newTags.push(edited); 
} 
+0

私はそれにl10nを渡すだけで、これはうまくいくようですが、タグ全体ではないのですか? – twenty

+0

回答を編集して実装します。 – clabe45

関連する問題