মান JSON সহ কী অদলবদল করুন


106

আমার কাছে অত্যন্ত বৃহত্ JSON অবজেক্টটি এই জাতীয় কাঠামোযুক্ত রয়েছে:

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

আমার একটি ফাংশন দরকার যা আমার বস্তুর কীগুলির সাথে মানগুলি অদলবদল করতে পারে এবং আমি কীভাবে এটি করব তা জানি না। আমার এভাবে আউটপুট লাগবে:

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

এমন কি কোনও উপায় আছে যে আমি নিজেই এটিরূপে একটি নতুন অবজেক্ট তৈরি করতে পারি যেখানে সবকিছু অদলবদল হয়?
ধন্যবাদ


1
সমস্ত মান সংখ্যা এবং সংখ্যা পুনরাবৃত্তি না? যদি মানগুলি পুনরাবৃত্তি করে তবে আপনি সেগুলি অদলবদল করতে সক্ষম হবেন না কারণ তারা অন্যদের ওভাররাইট করে দেবে, যদি না আপনি তাদের মানটি কোনও অনন্য মানেরতে পরিবর্তন করেন। আরও ভাল সমাধান হতে পারে যে অদলবদলের প্রয়োজনের কারণ কী?
প্যাট্রিক ইভান্স

@ পেট্রিকএভানস তারা সমস্ত সংখ্যা তবে তারা পুনরাবৃত্তি করে না। আমি একটি বেসিক সাইফার তৈরি করার চেষ্টা করছি।
সি

2
এটি লক্ষণীয় যে এইরকম একটি "অদলবদল" অপারেশন দুটি কারণেই সমস্যাযুক্ত: 1) মানগুলি স্ট্রিংগুলিতে ফেলে দেওয়া হয় যখন তারা কী হয়ে যায় তাই আপনার যখন অপ্রত্যাশিত "[অবজেক্ট অবজেক্ট]" কী থাকে তখন অবাক হবেন না। এবং 2) সদৃশ মানগুলি (স্ট্রিংয়ে কাস্ট করার পরে) ওভাররাইট করা হয়। # 1, কমপক্ষে, কোনও অবজেক্টের পরিবর্তে মানচিত্র তৈরি করে সমাধান করা যেতে পারে, এভাবে:function swap(obj) {return new Map(Object.entries(x).map([k, v] => [v, k]))}
ব্রুফা

উত্তর:


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

এখানে উদাহরণ বেহালার ভুলবেন আপনার কনসোলে চালু করতে ফলাফল দেখতে না।


ES6 সংস্করণ:

static objectFlip(obj) {
  const ret = {};
  Object.keys(obj).forEach(key => {
    ret[obj[key]] = key;
  });
  return ret;
}

অথবা অ্যারে.রেডস () এবং অবজেক্ট.কিজ () ব্যবহার করে

static objectFlip(obj) {
  return Object.keys(obj).reduce((ret, key) => {
    ret[obj[key]] = key;
    return ret;
  }, {});
}

অথবা অ্যারে.রেডস () এবং অবজেক্ট.এন্ট্রি () ব্যবহার করে

static objectFlip(obj) {
  return Object.entries(obj).reduce((ret, entry) => {
    const [ key, value ] = entry;
    ret[ value ] = key;
    return ret;
  }, {});
}


39

ES6 ব্যবহার:

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

2
আজকাল (2019) এর জন্য আরও ভাল সমাধান বলে মনে হচ্ছে! কেউ নিশ্চিত করতে পারেন, তাই না? পারফর্মেন্স ভাল? শব্দার্থক নিখুঁত: আমরা দেখতে পাচ্ছি যে এটি সত্যই একটি সাধারণ "মানচিত্র এবং অদলবদল" সমাধান solution
পিটার ক্রাউস

1
@ পিটার-ক্রাউস, jsben.ch/gHEtn এর সাথে টিঙ্কারটিতে আপনাকে স্বাগত জানাই যদি আমি কিছু মিস করি তবে এই উত্তর এবং জেপিওর উত্তরের মধ্যে একটি নৈমিত্তিক তুলনা দেখায় যে জেপিও-র লুপ আউটপ্রেমগুলি গ্র্যাপিকের মানচিত্রের প্রায় 3 থেকে 1 দ্বারা প্রকাশ করে (কমপক্ষে উপর আমার ব্রাউজার)।
মাইকেল হেজে

36

বস্তুর কীগুলি পান এবং তারপরে অ্যারের হ্রাস ফাংশনটি প্রতিটি কী ব্যবহার করে মানটি কী হিসাবে এবং মানটি কী হিসাবে সেট করুন।

const data = {
  A: 1,
  B: 2,
  C: 3,
  D: 4
}
const newData = Object.keys(data).reduce(function(obj, key) {
  obj[data[key]] = key;
  return obj;
}, {});
console.log(newData);


30

ES6 / ES2015 আপনি ব্যবহার একত্রিত করতে পারেন Object.keys এবং কমাতে নতুন Object.assign ফাংশন, একটি তীর ফাংশন , এবং একটি কম্পিউটেড সম্পত্তি নাম একটি প্রশংসনীয় সহজবোধ্য একক বিবৃতি সমাধান জন্য।

const foo = { a: 1, b: 2, c: 3 };
const bar = Object.keys(foo)
    .reduce((obj, key) => Object.assign({}, obj, { [foo[key]]: key }), {});

যদি আপনি অবজেক্ট স্প্রেড অপারেটর (এটি লেখার তৃতীয় ধাপ 3) ব্যবহার করে ট্রান্সপিল করছেন যা কিছুটা আরও সহজ করে দেবে।

const foo = { a: 1, b: 2, c: 3 };
const bar = Object.keys(foo)
    .reduce((obj, key) => ({ ...obj, [foo[key]]: key }), {});

অবশেষে, যদি আপনার অবজেক্ট.এন্ট্রিগুলি উপলব্ধ থাকে (লেখার মতো পর্যায় 4), আপনি যুক্তিকে আরও স্পর্শ করতে পারেন (আইএমও)।

const foo = { a: 1, b: 2, c: 3 };
const bar = Object.entries(foo)
    .reduce((obj, [key, value]) => ({ ...obj, [value]: key }), {});

সিনট্যাক্স এরির: / ইউজার / মার্কস / এন্টওয়াইক্লুং / আইটি 1_বেলেগ / প্রজাতন্ত্র / এস 6 / ভোকাবেলট্রাইনার.জেএস: অপ্রত্যাশিত টোকেন (53:45) 51 | if (btoa) {52 | এন্ট্রি = অবজেক্ট.এন্ট্রি (এন্ট্রি)> 53 | .reduce ((اعتراض, [কী, মান]) => ({... আপত্তি, [মান]: কী}), {}); | ^
সুপারলোক্কাস

@ সুপারলক্কাস সেই ত্রুটি আউটপুট সম্পর্কে আমার সর্বোত্তম ব্যাখ্যাটি হ'ল আপনি অবজেক্ট স্প্রেড সিনট্যাক্সটি স্থানান্তর করছেন না এবং আজকের মতো আমি জাভাস্ক্রিপ্ট ইঞ্জিনগুলিকে জানি না যা এটিকে স্থানীয়ভাবে সমর্থন করে।
জোসলারসন

1
@ গ্রাফিকের সমাধান দেখুন, আরও ভাল (সহজতম!) বলে মনে হচ্ছে।
পিটার ক্রাউস

16

এখন যে আমাদের অবজেক্ট.ফ্রন্টএন্ট্রি রয়েছে:

obj => Object.fromEntries(Object.entries(obj).map(a => a.reverse()))

অথবা

obj => Object.fromEntries(Object.entries(obj).map(([k, v]) => ([v, k])))

নোড.জেএস 12 সংস্করণ অনুসারে অবজেক্ট অদলবদলের স্ট্যান্ডার্ড পদ্ধতিও হওয়া উচিত।
ক্ষতিগ্রস্ত জৈব

4

@ জোসলারসন এবং @ জেপিওর উত্তরগুলির পরিপূরক হিসাবে:
ES6 প্রয়োজন ছাড়া আপনি ব্যবহার করতে পারেন এবং কমা অপারেটর :Object.keys Array.reduce

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

কিছু এটি কুরুচিপূর্ণ দেখতে পারে, তবে এটি প্রতিটি "লুপের reduceসমস্ত বৈশিষ্ট্য ছড়িয়ে দেয় না বলে এটি দ্রুত" কৃপা " obj


এখনও ... জেপিওর উত্তর এটিকে প্রায় 2: 1 দ্বারা ছাড়িয়ে যায়। jsben.ch/R75aI (আমি জানি আপনার মন্তব্য অনেক আগে থেকেই ছিল, তবে আমি গ্র্যাপিকের উত্তর সম্পর্কে মন্তব্য করছিলাম এবং বুঝতে পেরেছিলাম যে আমি আপনার উদাহরণটিও চালিয়ে যাব)।
মাইকেল হেজে

পুরোটাই, লুপ জন্য একটি দ্রুততর তারপর রয়ে forEach, mapবা reduceপদ্ধতি। আমি এস -6 এর প্রয়োজনীয়তা ছাড়াই ওয়ান-লাইনারের সমাধান করার জন্য এই প্রতিক্রিয়াটি তৈরি করেছি এবং গতি / কার্যকারিতার দিক থেকে এখনও প্রাসঙ্গিক।
Vaidd4

জুন 2019 এবং এটি সর্বশেষতম গুগল ক্রোমে আর সত্য নয়, পার্থক্যটি এখন অস্তিত্বের কাছে (9:10)
ইভান ক্যাস্তেলানানোস



2

সবচেয়ে কম আমি ES6 ব্যবহার করে এসেছি ...

const original = {
 first: 1,
 second: 2,
 third: 3,
 fourth: 4,
};


const modified = Object
  .entries(original)
  .reduce((all, [key, value]) => ({ ...all, [value]: key }), {});

console.log('modified result:', modified);



1

আমি বিশ্বাস করি একটি এনপিএম মডিউল ব্যবহার করে এই কাজটি করা ভাল invert-kv

বিপরীতমুখী-কেভি : কোনও বস্তুর কী / মানটি । উদাহরণ: oo ফু: 'বার'} → {বার: 'ফু'}

https://www.npmjs.com/package/invert-kv

const invertKv = require('invert-kv');

invertKv({foo: 'bar', unicorn: 'rainbow'});
//=> {bar: 'foo', rainbow: 'unicorn'}

1
@ স্ক0টিডি পরামর্শ দেয় বা লুপের জন্য এমনকি সাধারণের মতো এক-লাইন সমাধানের চেয়ে আরও একটি লাইব্রেরি কেন ব্যবহার করা ভাল?
আরেল

1

খাঁটি এবং বিন্দু মুক্ত শৈলীতে খাঁটি রমদা সহ:

const swapKeysAndValues = R.pipe(
   R.toPairs,
   R.map(R.reverse),
   R.fromPairs,
);

বা, আরও কিছুটা সংশ্লেষিত ES6 সংস্করণ সহ, এখনও বিশুদ্ধ কার্যকরী:

const swapKeysAndValues2 = obj => Object
    .entries(obj)
    .reduce((newObj, [key, value]) => ({...newObj, [value]: key}), {})

0
    var data = {A : 1, B : 2, C : 3, D : 4}
    var newData = {};
    Object.keys(data).forEach(function(key){newData[data[key]]=key});
    console.log(newData);

3
এটা objectকোথা থেকে আসে?
ম্যাক্সিম লাওনিস

এবং এটি করার মতো কথা নয় map, আপনি এটি এখানে ব্যবহার করছেনforEach
বার্বসান

আমি কখনোই প্রত্যেকের জন্য ব্যবহার করিনি। আমি আন্ডারস্কোর.জেএস এর প্রতিটি ফাংশন ব্যবহার করি তাই ফোর প্রতিটি সম্পর্কে জানতাম না। আপনাকে ধন্যবাদ বার্বসন
অনুপ আগরওয়াল

0

এখানে উল্টানো keysএবং valuesES6 এর খাঁটি কার্যকরী বাস্তবায়ন :

টাইপরাইটারে মুদ্রি

  const flipKeyValues = (originalObj: {[key: string]: string}): {[key: string]: string} => {
    if(typeof originalObj === "object" && originalObj !== null ) {
      return Object
      .entries(originalObj)
      .reduce((
        acc: {[key: string]: string}, 
        [key, value]: [string, string],
      ) => {
        acc[value] = key
        return acc;
      }, {})
    } else {
      return {};
    }
  }

জাভাস্ক্রিপ্ট

const flipKeyValues = (originalObj) => {
    if(typeof originalObj === "object" && originalObj !== null ) {
        return Object
        .entries(originalObj)
        .reduce((acc, [key, value]) => {
          acc[value] = key
          return acc;
        }, {})
    } else {
        return {};
    }
}

const obj = {foo: 'bar'}
console.log("ORIGINAL: ", obj)
console.log("FLIPPED: ", flipKeyValues(obj))


0
function swapKV(obj) {
  const entrySet = Object.entries(obj);
  const reversed = entrySet.map(([k, v])=>[v, k]);
  const result = Object.fromEntries(reversed);
  return result;
}

এটি আপনার অবজেক্টটিকে, {A : 1, B : 2, C : 3, D : 4}অ্যারের মতো করে তুলতে পারে, যাতে আপনি তা করতে পারেন

const o = {A : 1, B : 2, C : 3, D : 4}
const arrayLike = swapKV(o);
arrayLike.length = 5;
const array = Array.from(arrayLike);
array.shift(); // undefined
array; // ["A", "B", "C", "D"]

0

এখানে একটি বিকল্প যা মানগুলির সাথে কীগুলি অদলবদল করে তবে ডুপ্লিকেটগুলি হারাবে না, যদি আপনার অবজেক্টটি হয়: {a: 1, b: 2, c: 2}, এটি সর্বদা আউটপুটে একটি অ্যারে ফিরিয়ে দেবে:

function swapMap(map) {
    const invertedMap = {};
    for (const key in map) {
        const value = map[key];
        invertedMap[value] = invertedMap[value] || [];
        invertedMap[value].push(key);
    }
    return invertedMap;
}
swapMap({a: "1", b: "2", c: "2"})
// Returns => {"1": ["a"], "2":["b", "c"]}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.