2017-03-22 5 views
2

私は大きなオブジェクトを持っていますが、オブジェクト内の各要素に同じキーまたはキーの数がありません。最初の要素にすべてのキーがあり、この最初の要素のの値は、各要素のキーとして実際に使用したいもので、要素にこのキーがない場合は空白で埋めます。Javascript別のオブジェクトのキーと値に基づいて新しいオブジェクトを書き込む

何が起こる必要があるのか​​、私の脳を包み込むことができますが、コード化の仕方は分かりません。この例で

[ 
    { 
     "A": "Name", 
     "B": "Type", 
     "C": "Company", 
     "D": "Year", 
     "E": "Alt1", 
     "F": "Name1", 
     "G": "Alt2", 
     "H": "Name2", 
     "I": "Notes" 
    }, 
    { 
     "A": "Skittles", 
     "C": "Mars", 
     "D": 0, 
     "E": "Cadbury", 
     "F": "Sour Patch Kids", 
     "I": "CLEAN" 
    }, 
    { 
     "A": "Love", 
     "B": "Chocolate", 
     "C": "Dove", 
     "D": 0, 
     "E": "0", 
     "F": "0", 
    } 
] 

、2番目の要素は、「G」及び「H」、第三の要素は、「G」のキーが欠落している間にキー「B」が欠けている、私はそれをインポートし、これはサンプルであります"H"と "I"。だから、A through Iは、マスターテンプレートとして最初の要素のキーを使用して、私はこのようになります新しいオブジェクト、書き直したい:

[ 
    { 
     "Name": "Skittles", 
     "Type": "", 
     "Company": "Mars", 
     "Year": 0, 
     "Alt1": "Cadbury", 
     "Name1": "Sour Patch Kids", 
     "Alt2": "", 
     "Name2": "", 
     "Notes": "CLEAN" 
    }, 
    { 
     "Name": "Love", 
     "Type" : "Chocolate", 
     "Company": "Dove", 
     "Year": 0, 
     "Alt1": "", 
     "Name1": "", 
     "Alt2": "", 
     "Name2": "", 
     "Notes": "" 
    } 
] 

を私はいくつかのforループを書いたが、私はの複雑さを把握するように見えることはできませんあなたは、Fのみの要素を反復処理することができ....

a = []; 
b = []; 
new_keys = []; 

/* Capture the new keys */ 
for(var v in user_file[0]) { 
    if(user_file[0].hasOwnProperty(v)) { 
    new_keys.push(user_file[0][v]); 
    } 
} 

/* user_file is the object I pasted above... */ 
for (var i = 0 ; i<user_file.length; i++) { 
    /* write the b object */ 

    /* then push that object into a */ 
    a.push(b); 

    /* Empty out b */ 
    b = []; 
} 

私はどのようにこのb[]オブジェクトを書き込むには考えている

+2

まず、[for..in'ループを配列に使用しない](http://stackoverflow.com/q/500504/215552)。 –

+1

@MikeMcCaughan彼はいません。 'user_file [0]'はオブジェクトであり、配列ではありません。 – Barmar

+0

@Barmar D'oh!あなたは明らかに正しいです。それでもやってはいけない。あなたが将来に誘惑されているなら、 - )... *静かに逃げる*。 –

答えて

1

:これは...これは私の知る限り得ているようですROMのインデックス1以上を使用し、インデックス0のオブジェクトを青いプリントとしてオブジェクトに取り込みます。

var data = [{ A: "Name", B: "Type", C: "Company", D: "Year", E: "Alt1", F: "Name1", G: "Alt2", H: "Name2", I: "Notes" }, { A: "Skittles", C: "Mars", D: 0, E: "Cadbury", F: "Sour Patch Kids", I: "CLEAN" }, { A: "Love", B: "Chocolate", C: "Dove", D: 0, E: "0", F: "0", }], 
 
    keys = Object.keys(data[0]), 
 
    result = data.slice(1).map(function (o) { 
 
     var temp = {}; 
 
     keys.forEach(function (k) { 
 
      temp[data[0][k]] = k in o ? o[k] : ''; 
 
     }); 
 
     return temp; 
 
    }); 
 

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

+0

これはとても美しいです。私は前に '.map'を使用していません - それはどのように動作するかを学ばなければなりませんが、それ以外は完璧な意味があります。私は三項表現も好きです...素敵で清潔です!ありがとうございました! –

+0

式を ';'の代わりに '、'で終わらせる理由を説明できますか?私はこれらの2つの違いが何であるか分かりません。私はいつもセミコロン 'console.log(" hi ");' –

+0

で宣言を終了しましたか? 'var'キーワードを持つ変数は通常コンマで区切られます。 –

1

あなたはObject.keysと一緒にforEachmapのような配列方法を使用することにより、プロセスを簡素化することができます。

var array = [ 
 
    { 
 
     "A": "Name", 
 
     "B": "Type", 
 
     "C": "Company", 
 
     "D": "Year", 
 
     "E": "Alt1", 
 
     "F": "Name1", 
 
     "G": "Alt2", 
 
     "H": "Name2", 
 
     "I": "Notes" 
 
    }, 
 
    { 
 
     "A": "Skittles", 
 
     "C": "Mars", 
 
     "D": 0, 
 
     "E": "Cadbury", 
 
     "F": "Sour Patch Kids", 
 
     "I": "CLEAN" 
 
    }, 
 
    { 
 
     "A": "Love", 
 
     "B": "Chocolate", 
 
     "C": "Dove", 
 
     "D": 0, 
 
     "E": "0", 
 
     "F": "0", 
 
    } 
 
] 
 

 
var master = array.shift() 
 

 
master = Object.keys(master).map(function (k) { return [k, this[k]] }, master) 
 

 
array.forEach(function (e) { 
 
    master.forEach(function (pair) { 
 
    var value = pair[0] in e ? e[pair[0]] : defaultValueFor(pair[0]) 
 
    delete e[pair[0]] 
 
    e[pair[1]] = value 
 
    }) 
 
}) 
 

 
console.log(array) 
 

 

 
function defaultValueFor (key) { 
 
    return key === 'Year' ? 0 : '' 
 
}

1

ここでは、これは終らの一つの方法のステップバイステップの内訳です。これは

var user_file = [ 
 
    { 
 
     "A": "Name", 
 
     "B": "Type", 
 
     "C": "Company", 
 
     "D": "Year", 
 
     "E": "Alt1", 
 
     "F": "Name1", 
 
     "G": "Alt2", 
 
     "H": "Name2", 
 
     "I": "Notes" 
 
    }, 
 
    { 
 
     "A": "Skittles", 
 
     "C": "Mars", 
 
     "D": 0, 
 
     "E": "Cadbury", 
 
     "F": "Sour Patch Kids", 
 
     "I": "CLEAN" 
 
    }, 
 
    { 
 
     "A": "Love", 
 
     "B": "Chocolate", 
 
     "C": "Dove", 
 
     "D": 0, 
 
     "E": "0", 
 
     "F": "0", 
 
    } 
 
]; 
 
// split off the first set of keys 
 
var keys = user_file[0]; 
 
// keep the data separate 
 
var data = user_file.splice(1); 
 
// iterate over the data 
 
var result = data.map(function (item) { 
 
    // item is now one of the last two items 
 
    // get the keys for that item 
 
    var itemKeys = Object.keys(item); 
 
    // Make a blank 
 
    var newItem = {}; 
 
    // iterate over the keys 
 
    itemKeys.forEach(function (key) { 
 
     // get the "real" key name 
 
     var realKey = keys[key]; 
 
     // set the value of that key to the value of the item 
 
     newItem[realKey] = item[key]; 
 
    }); 
 
    // add to result 
 
    return newItem; 
 
}); 
 
console.log(result);

1

...任意の三元またはifブロックを必要としないという利点を持っていますこれを行うには、より効率的な方法は、おそらくありますが、これは動作します、私は一緒に投げたものです。

var data = [{ 
 
    "A": "Name", 
 
    "B": "Type", 
 
    "C": "Company", 
 
    "D": "Year", 
 
    "E": "Alt1", 
 
    "F": "Name1", 
 
    "G": "Alt2", 
 
    "H": "Name2", 
 
    "I": "Notes" 
 
}, { 
 
    "A": "Skittles", 
 
    "C": "Mars", 
 
    "D": 0, 
 
    "E": "Cadbury", 
 
    "F": "Sour Patch Kids", 
 
    "I": "CLEAN" 
 
}, { 
 
    "A": "Love", 
 
    "B": "Chocolate", 
 
    "C": "Dove", 
 
    "D": 0, 
 
    "E": "0", 
 
    "F": "0", 
 
}]; 
 

 
var keyMap = data.shift(); 
 
var templateObj = { 
 
    "A": '', 
 
    "B": '', 
 
    "C": '', 
 
    "D": '', 
 
    "E": '', 
 
    "F": '', 
 
    "G": '', 
 
    "H": '', 
 
    "I": '', 
 
}; 
 
var results = []; 
 

 
data.forEach(function(item) { 
 
    var tmpResult = Object.assign({}, templateObj, item); 
 
    var processedItem = {}; 
 
    for (var prop in tmpResult) { 
 
    processedItem[keyMap[prop]] = tmpResult[prop]; 
 
    } 
 
    results.push(processedItem); 
 
}); 
 

 
console.log(results);

2

あなたは本当に近いです。

Javascriptでは、実際には配列のようなオブジェクトにアクセスできます。 obj['key1']obj.key1と同じ値を返します。

は今、あなたはそれらのキーのリストを持っていること、そしてあなたは、A, B, C, etc.はあなたが実際にこれらのキーを反復処理し、情報(tmp[user_file[0][letter]] = user_file[i][letter])を格納するための一時的なオブジェクトを使用することができるためにどのキー(user_file[0][letter])対応する文字を知っています。

しかし、user_file[i][letter]が存在しない場合はどうなりますか? これは、javascriptに関する最もクールな機能の1つです:truthiness。オブジェクトにプロパティがなく、アクセスしようとすると、偽の値が返されます(nullまたはundefined、私は頭の上から覚えていません)。

真理をどのように適用しますか?まあ、ちょっとブーリアン(kinda)のように扱い、実際には||操作を使用することができます。これは合体と呼ばれる手法です。

tmp[user_file[0][letter]] = user_file[i][letter] || ""; 

user_file[i][letter]が代わりに使用""存在しない場合は簡単な言葉で、この行を入れて。

素晴らしいですが、次に何がすばらしいですか?今はすべてをまとめなければなりません。

あなたがオブジェクト配列の残りの部分を反復処理は、我々はすぐそこにすべてのことを行うことができますループで最初のループを配置する場合:

​​3210

そしてそこにあなたがそれを持っているし、中の値からオブジェクト配列を後の要素にそれらのキーに対応する値がない場合でも、最初の要素の値をキーとして使用して、最初の要素より後のオブジェクトを削除します。

+1

この説明にはありがとうございます!本当に本当に助かりました! –

+0

@BrianPowell問題なく、助けてくれてうれしい! –

関連する問題