2014-04-11 10 views
31

मैं एक बहुत बड़े JSON ऑब्जेक्ट इस तरह संरचित है:स्वैप कुंजी

{A : 1, B : 2, C : 3, D : 4} 

मैं एक समारोह है कि मेरे वस्तु में कुंजी के साथ मूल्यों स्वैप कर सकते हैं की जरूरत है और मैं इसे कैसे करना है पता नहीं है ।

{1 : A, 2 : B, 3 : C, 4 : D} 

वहाँ किसी भी तरह से है कि मैं यह कर सकता मैन्युअल रूप से एक नई वस्तु जहां सब कुछ बदली है बनाए गए है: मैं इस तरह एक आउटपुट की आवश्यकता होगी?
धन्यवाद

+1

सभी मूल्य संख्याएं हैं और संख्याएं दोहराती हैं? यदि मान दोहराए जाते हैं तो आप उन्हें स्वैप करने में सक्षम नहीं होंगे क्योंकि वे दूसरों को ओवरराइट करेंगे, जब तक कि आप उनके मूल्य को कुछ अद्वितीय मान में नहीं बदल देते। एक बेहतर समाधान हो सकता है स्वैप की आवश्यकता के कारण क्या है? –

+0

@PatrickEvans वे सभी संख्याएं हैं लेकिन वे दोहराना नहीं है। मैं एक बुनियादी सिफर बनाने की कोशिश कर रहा हूँ। – C1D

उत्तर

45
function swap(json){ 
    var ret = {}; 
    for(var key in json){ 
    ret[json[key]] = key; 
    } 
    return ret; 
} 

उदाहरण यहाँ FIDDLE भूलना अपने कंसोल पर चालू करने के लिए परिणाम देखने के लिए नहीं है।

+0

इसके लिए आपको बहुत बहुत धन्यवाद! मैंने सभी स्टैकएक्सचेंज की खोज की थी और मुझे कोई जवाब नहीं मिला। – C1D

+0

आपका स्वागत है :) – jPO

+1

इसकी सुंदरता यह है कि 'जावास्क्रिप्ट' के लिए भी काम करता है।+ 1 वोट – AXL

21

ऑब्जेक्ट की चाबियाँ प्राप्त करें, और फिर प्रत्येक कुंजी के माध्यम से जाने के लिए ऐरे के कम फ़ंक्शन का उपयोग करें और मान को कुंजी के रूप में सेट करें, और कुंजी को मान के रूप में सेट करें।

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); 
15

आप _.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'] } 
11

उपयोग कर सकते हैं ES6/ES2015 में आप, नई Object.assign समारोह के साथ Object.keys और reduce के उपयोग को जोड़ सकते हैं एक arrow function समारोह lodash उपयोग कर सकते हैं, और एक एक सुंदर सीधा एकल कथन समाधान के लिए 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 }), {}); 

आप (इस लेखन के रूप में मंच 3) object spread operator का उपयोग कर कि चीजें थोड़ा आगे सरल होगा 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 }), {}); 
+0

सिंटेक्स त्रुटि: /Users/markus/Entwicklung/IT1_Beleg/public/es6/vokabeltrainer.js: अप्रत्याशित टोकन (53:45) 51 | अगर (बीटीए) { 52 | प्रविष्टियां = ऑब्जेक्ट .entries (प्रविष्टियां) > 53 | .reduce ((obj, [key, value]) => ({... obj, [value]: key}), {}); |^ – Superlokkus

+0

@ सुपरलोक्कस उस त्रुटि आउटपुट की मेरी सबसे अच्छी व्याख्या यह है कि आप ऑब्जेक्ट फैल सिंटैक्स को पार नहीं कर रहे हैं, और आज के रूप में, मुझे किसी भी जावास्क्रिप्ट इंजन के बारे में पता नहीं है जो इसे मूल रूप से समर्थन देता है। – joslarson

3

ES6 का उपयोग करना:

const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" }; 
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a }))) 
1

Ramda का उपयोग करना:

const swapKeysWithValues = (source) => 
    R.pipe(
    R.keys, 
    R.reduce((obj, k) => R.assoc(source[k], k, obj), {}) 
)(source); 
0

@joslarson के पूरक और @jPO जवाब के रूप में:
बिना ES6 की जरूरत है, आप Object.keysArray.reduce उपयोग कर सकते हैं और Comma Operator:

Object.keys(foo).reduce((obj, key) => (obj[foo[key]] = key, obj), {}); 

कुछ इसे बदसूरत पाते हैं, लेकिन यह reduce जितना तेज़ "थोडा" है, प्रत्येक लूप पर obj के सभी गुणों को फैलाता नहीं है।

संबंधित मुद्दे