我有結構化的這樣一個非常大的JSON對象:切換鍵
{A : 1, B : 2, C : 3, D : 4}
我需要一個可以在我的對象鍵交換值的功能,我不知道該怎麼做。我需要一個像這樣的輸出:
{1 : A, 2 : B, 3 : C, 4 : D}
有什麼辦法,我可以做這將手動創建的一切是換一個新的對象?
感謝
我有結構化的這樣一個非常大的JSON對象:切換鍵
{A : 1, B : 2, C : 3, D : 4}
我需要一個可以在我的對象鍵交換值的功能,我不知道該怎麼做。我需要一個像這樣的輸出:
{1 : A, 2 : B, 3 : C, 4 : D}
有什麼辦法,我可以做這將手動創建的一切是換一個新的對象?
感謝
獲取對象的關鍵字,然後使用Array的reduce函數遍歷每個關鍵字並將該值設置爲關鍵字,並將關鍵字設置爲值。
var data = {A : 1, B : 2, C : 3, D : 4}
var newData = Object.keys(data).reduce(function(obj,key){
obj[ data[key] ] = key;
return obj;
},{});
console.log(newData);
可以使用lodash功能_.invert它也可以使用multivlaue
var object = { 'a': 1, 'b': 2, 'c': 1 };
_.invert(object);
// => { '1': 'c', '2': 'b' }
// with `multiValue`
_.invert(object, true);
// => { '1': ['a', 'c'], '2': ['b'] }
在ES6/ES2015你可以結合使用Object.keys和reduce新Object.assign功能,arrow function和computed property name爲一個非常簡單的單一語句解決方案。
const foo = { a: 1, b: 2, c: 3 };
const bar = Object.keys(foo)
.reduce((obj, key) => Object.assign({}, obj, { [foo[key]]: key }), {});
如果您使用的object spread operator(第3階段寫這篇文章),這將簡化事情有點進一步transpiling。
const foo = { a: 1, b: 2, c: 3 };
const bar = Object.keys(foo)
.reduce((obj, key) => ({ ...obj, [foo[key]]: key }), {});
最後,如果你有Object.entries可用(第4階段爲撰寫本文時),你可以清理邏輯觸摸更(IMO)。
const foo = { a: 1, b: 2, c: 3 };
const bar = Object.entries(foo)
.reduce((obj, [key, value]) => ({ ...obj, [value]: key }), {});
SyntaxError:/Users/markus/Entwicklung/IT1_Beleg/public/es6/vokabeltrainer.js:意外的令牌(53:45) 51 |如果(btoa){ 52 | entries = Object.entries(entries) > 53 | .reduce((obj,[key,value])=>({... obj,[value]:key}),{}); |^ – Superlokkus
@Superlokkus我對錯誤輸出的最好解釋是,你沒有對對象擴展語法進行轉譯,截至今天,我不知道任何原生支持它的JavaScript引擎。 – joslarson
使用ES6:
const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" };
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })))
使用Ramda:
const swapKeysWithValues = (source) =>
R.pipe(
R.keys,
R.reduce((obj, k) => R.assoc(source[k], k, obj), {})
)(source);
由於@joslarson的補充和@jPO答案:
沒有ES6需要,您可以使用Object.keys
Array.reduce
和Comma Operator:
Object.keys(foo).reduce((obj, key) => (obj[foo[key]] = key, obj), {});
有些人可能會覺得它很醜陋,但它「有點」更快,因爲reduce
不會在每個循環上傳播obj
的所有屬性。
是否都是數值並重複數字?如果這些值重複出現,那麼您將無法交換它們,因爲它們會覆蓋其他值,除非您將它們的值更改爲某個唯一值。可能有更好的解決方案需要交換的原因是什麼? –
@PatrickEvans他們都是數字,但他們不重複。我試圖做一個基本的密碼。 – C1D