জাভাস্ক্রিপ্ট: অবজেক্ট নামকরণ কী


299

জাভাস্ক্রিপ্ট অবজেক্টে কীটির নতুন নামকরণের জন্য কি কোনও চতুর (অর্থাত্ত অনুকূলিত) উপায় আছে?

একটি অপ-অপ্টিমাইজড উপায় হ'ল:

o[ new_key ] = o[ old_key ];
delete o[ old_key ];

14
"অনুকূলিত" বলতে কী বোঝ? আমি মনে করি না এটি এর চেয়ে আরও বেশি পরিশ্রুত হতে পারে; অন্তর্নির্মিত অপারেশনটির কোনও "নাম পরিবর্তন" নেই।
পয়েন্টটি

9
এটিই আপনি পেতে পারেন। আমি আমার অ্যাপ্লিকেশনটিতে অন্যান্য জিনিস সম্পর্কে উদ্বিগ্ন হবে। এবং বিটিডব্লিউ, আপনি জিনিসগুলি নিয়ে কাজ করছেন, অ্যারে নয়। জাভাস্ক্রিপ্টে কোনও সংঘবদ্ধ অ্যারে নেই (কঠোর অর্থে)।
ফেলিক্স ক্লিং

3
@ জিন ভিনসেন্ট: এটা কি ধীর?
ফেলিক্স ক্লিং

8
এটি সবচেয়ে অপ্টিমাইজড এবং বেসিক সংস্করণ
লিভিংস্টন স্যামুয়েল

4
আপনার সংস্করণটি সাফারি, স্যাম্পল টেস্ট কেস বাদে সমস্ত আধুনিক ব্রাউজারে সবচেয়ে দ্রুতগতিতে @ jsperf.com/livi-006
লিভিংস্টন স্যামুয়েল

উত্তর:


193

এটি করার সর্বাধিক সম্পূর্ণ (এবং সঠিক) উপায় হ'ল, আমি বিশ্বাস করি:

if (old_key !== new_key) {
    Object.defineProperty(o, new_key,
        Object.getOwnPropertyDescriptor(o, old_key));
    delete o[old_key];
}

এই পদ্ধতিটি নিশ্চিত করে যে নাম পরিবর্তিত সম্পত্তিটি মূলটির সাথে একই রকম আচরণ করে

এছাড়াও, এটি আমার কাছে মনে হয় যে এটি কোনও ফাংশন / পদ্ধতিতে মোড়ানোর এবং এটি প্রয়োগ করার সম্ভাবনাটি Object.prototypeআপনার প্রশ্নের সাথে সম্পর্কিত নয় ant


1
এটি সমস্ত সম্পত্তি সংরক্ষণের আসল প্লাস সহ একটি দুর্দান্ত ES5- সমাধান। সুতরাং এটি "অপ্টিমাইজড" নয় তবে ইএস 5-তে অবশ্যই আরও সঠিক।
জিন ভিনসেন্ট

6
লেখার_পরিচয়_ওয়ালা_উইন্ডসকোর্সের প্রতি কিছুটা সংশয় নিয়ে উত্সাহিত হয়েছিল, তবে অবশ্যই সেই ব্যক্তি প্রশ্ন জিজ্ঞাসা করার কারণে হয়েছিল। এটি আমার দৃষ্টিতে সঠিক প্রতিক্রিয়া।
বেন্ড কার্ডান

3
যদি এটি গুরুত্বপূর্ণ হয় তবে আমি বিশ্বাস করি যে ES5 এর এই বিশেষ ব্যবহারটি একটি আই 9 9 এবং নতুন সমাধান।
স্কট স্টাফোর্ড

1
আমি একটি বৈধতা যোগ করার পরামর্শ দিচ্ছি যা o.old_key বিদ্যমান। পরিবর্তন করা হচ্ছে: if (old_key !== new_key)হবে: if (old_key !== new_key && o[old_key])
হোসে

100

আপনি কোনও ফাংশনে কাজটি মোড়ানো করতে পারেন এবং এটিকে Objectপ্রোটোটাইপে নির্ধারণ করতে পারেন । একাধিক নাম প্রবাহ করতে হয়ত সাবলীল ইন্টারফেস শৈলী ব্যবহার করুন।

Object.prototype.renameProperty = function (oldName, newName) {
     // Do nothing if the names are the same
     if (oldName === newName) {
         return this;
     }
    // Check for the old property name to avoid a ReferenceError in strict mode.
    if (this.hasOwnProperty(oldName)) {
        this[newName] = this[oldName];
        delete this[oldName];
    }
    return this;
};

ECMAScript 5 নির্দিষ্ট

আমি চাই সিনট্যাক্সটি এই জটিলটি না হলেও এটি আরও নিয়ন্ত্রণে থাকা অবশ্যই ভাল।

Object.defineProperty(
    Object.prototype, 
    'renameProperty',
    {
        writable : false, // Cannot alter this property
        enumerable : false, // Will not show up in a for-in loop.
        configurable : false, // Cannot be deleted via the delete operator
        value : function (oldName, newName) {
            // Do nothing if the names are the same
            if (oldName === newName) {
                return this;
            }
            // Check for the old property name to 
            // avoid a ReferenceError in strict mode.
            if (this.hasOwnProperty(oldName)) {
                this[newName] = this[oldName];
                delete this[oldName];
            }
            return this;
        }
    }
);

4
@ চাওসপ্যান্ডিয়ন এটি সম্পর্কে দুঃখিত, তবে আমি বাগ চালিত জেএস কোডটি দেখে সত্যিই ক্লান্ত হয়ে পড়েছি, আমি বর্তমানে সমস্ত কিরিক্স সম্পর্কে একটি গাইড ( github.com / বনসাইডেন / জাভা স্ক্রিপ্ট- জর্ডান ) লিখছি ( আপনি এখন যেটিকে ঠিক করেছেন তার সাথে), এটি আমাকে একরকম রেন্ট মোডে ফেলেছিল;) (এখন -1 মুছে ফেলা হয়েছে)
আইভো ওয়েটজেল

1
@ আইভো - আপনি প্রোটোটাইপ প্রসারিত করা খারাপ মনে করছেন কেন তা ব্যাখ্যা করতে পারেন? প্রোটোটাইপগুলি বাচ্চা বাড়ানোর জন্য তৈরি করা হয়েছিল!
কেওসপ্যান্ডিয়ন

5
@ আইভো - আমি সম্মত হই যে এটি ঝুঁকিপূর্ণ, তবে এমন কিছু নেই যা আমাকে প্রোটোটাইপ বাড়ানো থেকে বিরত রাখবে যদি আমি অনুভব করি যে এটি আরও অভিব্যক্তিপূর্ণ কোডের দিকে নিয়ে যায়। যদিও আমি একটি ECMAScript 5 মানসিকতা থেকে আসছি যেখানে আপনি কোনও সম্পত্তি অ-গণনাযোগ্য হিসাবে চিহ্নিত করতে পারেন Object.defineProperty
কেওসপ্যান্ডিয়ন

3
@ আইভো - যদি hasOwnPropertyসম্পত্তি এবং for ... inলুপগুলির মধ্যে সর্বদা পরীক্ষা করার জন্য সর্বদা ব্যবহার করা যথাযথ অনুশীলন হয় , তবে আমরা যদি অবজেক্টটি প্রসারিত করি তবে এটি কেন গুরুত্বপূর্ণ?
ডেভিড টাং

2
এই কোডটি কাজ করে তবে সতর্কতাটি হ'ল যদি নতুন কী নামটি ইতিমধ্যে বিদ্যমান থাকে তবে এর মান ট্রডডেন নেমে যেতে চলেছে: jsfiddle.net/ryurage/B7x8x
ব্র্যান্ডন মিন্টন

83

আপনি যদি আপনার উত্স অবজেক্টটি পরিবর্তন করছেন তবে ES6 এটি এক লাইনে করতে পারে।

delete Object.assign(o, {[newKey]: o[oldKey] })[oldKey];

অথবা দুটি লাইন যদি আপনি একটি নতুন অবজেক্ট তৈরি করতে চান।

const newObject = {};
delete Object.assign(newObject, o, {[newKey]: o[oldKey] })[oldKey];

5
চেষ্টা করুন: অবজেক্ট.সেসাইন মুছে দিন (ও, {নিউকি: o.oldKey})। ওল্ডকি; আমার জন্য ভাল কাজ করেছে
টিম

2
[]চারদিকে চৌকো বন্ধনী কেন newKey? সমাধান আসলে ছাড়া কাজ করে।
সৌম্য কান্তি

2
ঠিক আছে - আমি আমার উত্তর পেয়েছি। এটি ES6 বৈশিষ্ট্য। আমার মতো অন্য যে কেউ হোঁচট খেয়েছে, এখানে একটি উত্তরের উত্তর
সৌম্য কান্তি

1
এই পরিবর্তনটি আরও শক্তিশালী হবে যদি আপনার পরিবর্তনশীল নামগুলি আরও ভার্জোজ হয়।
নিম্নক্রোলার

1
সম্ভবত? দুঃখিত, আমি আমার প্রাথমিক মন্তব্যটি দিয়ে কী ভাবছিলাম তা ভুলে গিয়েছি।
নিম্নক্রোলার

42

যদি কারও বৈশিষ্ট্যের তালিকার নাম পরিবর্তন করতে হয়:

function renameKeys(obj, newKeys) {
  const keyValues = Object.keys(obj).map(key => {
    const newKey = newKeys[key] || key;
    return { [newKey]: obj[key] };
  });
  return Object.assign({}, ...keyValues);
}

ব্যবহার:

const obj = { a: "1", b: "2" };
const newKeys = { a: "A", c: "C" };
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);
// {A:"1", b:"2"}

2
এই উত্তর গ্রহণ করা উচিত, আমার ব্যবহারের ক্ষেত্রে দুর্দান্ত কাজ। আমাকে এমন একটি এপিআই প্রতিক্রিয়া রূপান্তর করতে হয়েছিল যা অপ্রয়োজনীয় স্ট্রিং সহ দেশের নাম উপসর্গ করছিল। অবজেক্টটিকে কীগুলির অ্যারে রূপান্তরিত করে এবং প্রতিটি কীটি সাবস্ট্রিং পদ্ধতিতে ম্যাপ করা হয় এবং নতুন কী এবং মূল কী অনুসারে মান অনুসারে একটি নতুন অবজেক্ট ফিরিয়ে দেয়
আকিন হাওয়ান

1
পুরানো চাবিটি মুছে না বলে এটি দুর্দান্ত। পুরানো কী মোছা মুছে ফেলা হলে কীটি পুরোপুরি মুছে ফেলা হবে যদি কী নামটি পরিবর্তন না হয়। আমার উদাহরণে, আমি রূপান্তর করা হয়েছিল my_object_propertyকরার myObjectPropertyঅবশ্য যদি আমার সম্পত্তি একক ভাষায় হলেন, তখন কী সরানো হয়েছে। +1
ব্লুপ্রিন্টক্রিস

25

আমি শুধু ES6(ES2015)উপায় ব্যবহার করতে চাই !

আমাদের সময়ের সাথে তাল মিলিয়ে চলতে হবে!

const old_obj = {
    k1: `111`,
    k2: `222`,
    k3: `333`
};
console.log(`old_obj =\n`, old_obj);
// {k1: "111", k2: "222", k3: "333"}


/**
 * @author xgqfrms
 * @description ES6 ...spread & Destructuring Assignment
 */

const {
    k1: kA, 
    k2: kB, 
    k3: kC,
} = {...old_obj}

console.log(`kA = ${kA},`, `kB = ${kB},`, `kC = ${kC}\n`);
// kA = 111, kB = 222, kC = 333

const new_obj = Object.assign(
    {},
    {
        kA,
        kB,
        kC
    }
);

console.log(`new_obj =\n`, new_obj);
// {kA: "111", kB: "222", kC: "333"}

ডেমো স্ক্রিন শর্টকাট


1
আপনি যখন একটি ত্রুটিযুক্ত কোনও বস্তুকে ব্র্যান্ডের নতুন পুনর্গঠিত একটিতে রূপান্তর করতে চান তখন এটি ক্লিনার সমাধান হিসাবে পেয়েছেন।
এনজেআইমনদার

5
ভাল, তবে আমি মনে করি কনস্ট্রাক্ট {কে 1: কেএ, কে 2: কেবি, কে 3: কেসি,} = ওল্ড_বজ যথেষ্ট? ছড়িয়ে পড়ার দরকার নেই (যদি না আপনি old_obj এর একটি অনুলিপি চান)।
হ্যান্স

@ হাস, হ্যাঁ আপনি ঠিক বলেছেন। তবে এই পরিস্থিতিতে আমি কিছু কীগুলির নাম পরিবর্তন করতে চাই, তাই আমার সেগুলি ছড়িয়ে দেওয়া উচিত।
xgqfrms-gildata

2
এর জন্য আরও অনেক কোড প্রয়োজন, কম দক্ষ হবে এবং একটি নতুন অবজেক্ট তৈরি করে। কোনও সম্পত্তির নাম পরিবর্তনের অর্থ বস্তুর পরিবর্তন করা। সর্বদা আরও ভাল হয় না।
জিন ভিনসেন্ট

16

আপনি যদি নিজের ডেটা পরিবর্তন করতে না চান তবে এই ফাংশনটি বিবেচনা করুন ...

renameProp = (oldProp, newProp, {[oldProp]:old, ...others}) => ({
    [newProp]: old,
    ...others
})

ইয়াজিদ বাজাডোফের একটি সম্পূর্ণ ব্যাখ্যা https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd



এটিই সেরা সমাধান। তবে স্প্রেড অপারেটর সম্পর্কে কিছুটা বুঝতে হবে।
ফ্র্যাঙ্কো ফং

13

এখানে বেশিরভাগ উত্তর জেএস অবজেক্ট কী-মান জোড় ক্রম বজায় রাখতে ব্যর্থ। আপনি যদি স্ক্রিনে অবজেক্ট কী-মান জোড়ার একটি ফর্ম থাকে যা আপনি সংশোধন করতে চান, উদাহরণস্বরূপ, অবজেক্ট এন্ট্রিগুলির ক্রম সংরক্ষণ করা গুরুত্বপূর্ণ।

জেএস অবজেক্টের মধ্য দিয়ে লুপিংয়ের এবং E -6 উপায়টি পরিবর্তিত কী নামের নতুন জোড়ের সাথে কী-মান জুটির পরিবর্তে কিছু হবে:

let newWordsObject = {};

Object.keys(oldObject).forEach(key => {
  if (key === oldKey) {
    let newPair = { [newKey]: oldObject[oldKey] };
    newWordsObject = { ...newWordsObject, ...newPair }
  } else {
    newWordsObject = { ...newWordsObject, [key]: oldObject[key] }
  }
});

সমাধানটি পুরানোটির জায়গায় নতুন এন্ট্রি যুক্ত করে প্রবেশের ক্রম সংরক্ষণ করে।


নিখুঁত, এটি আমার প্রয়োজন
p0358

12

আপনি লোডাশ চেষ্টা করতে পারেন _.mapKeys

var user = {
  name: "Andrew",
  id: 25,
  reported: false
};

var renamed = _.mapKeys(user, function(value, key) {
  return key + "_" + user.id;
});

console.log(renamed);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>


এই সমাধানটি আমার পক্ষে কাজ করেছে তবে সর্বদা একটি 'কী' ভেরিয়েবল ফেরত দেওয়ার দিকে মনোযোগ দিন। উদাহরণ: যদি (key === 'oldKey') {'newKey' ফেরত দেয়; } রিটার্ন কী;
টমোমিহায়

12

অবজেক্ট ডেস্ট্রাকচারিং এবং স্প্রেড অপারেটর ব্যবহার করে একটি প্রকরণ:

    const old_obj = {
        k1: `111`,
        k2: `222`,
        k3: `333`
    };


// destructuring, with renaming. The variable 'rest' will hold those values not assigned to kA, kB, or kC.
    const {
        k1: kA, 
        k2: kB, 
        k3: kC,
        ...rest
    } = old_obj;


// now create a new object, with the renamed properties kA, kB, kC; 
// spread the remaining original properties in the 'rest' variable
const newObj = {kA, kB, kC, ...rest};

সম্ভবত আপনি ব্যাখ্যা করতে পারেন যে এটি কী করছে এবং এটি কীভাবে কাজ করে?
জন অ্যাডামস

@ জেফলওয়ারি যদি এটি অবজেক্টগুলির একটি অ্যারে হয়ে থাকে? আমার কি ভবিষ্যদ্বাণী করতে হবে বা আমি খুব স্প্রেড দিয়েও করতে পারি?
ব্যবহারকারী3808307

@ user3808307 আপনি অ্যারেতে স্প্রে করতে পারেন এবং অ্যারেতে অবজেক্টসও করতে পারেন।
জেফ লোরি

7

ব্যক্তিগতভাবে, অতিরিক্ত ভারী প্লাগইন এবং চাকা প্রয়োগ না করে অবজেক্টে কীগুলির নামকরণের সবচেয়ে কার্যকর উপায়:

var str = JSON.stringify(object);
str = str.replace(/oldKey/g, 'newKey');
str = str.replace(/oldKey2/g, 'newKey2');

object = JSON.parse(str);

try-catchআপনার অবজেক্টের অবৈধ কাঠামো থাকলে আপনি এটিকে মোড়ানোও করতে পারেন। পুরোপুরি কাজ করে :)


12
ওপস! var অবজেক্ট = {বি: '123', 'সি': 'বিবিবি'}; var str = JSON.stringify (অবজেক্ট); str = str.replace (/ b / g, 'newKey'); str = str.replace (/ c / g, 'newKey2'); অবজেক্ট = JSON.parse (str);
ব্লন্ডিংকাব্রাইন

4
এটি গতির জন্য কীভাবে তুলনা করে?
3d মিশ্রিত করুন

16
ডেটাভ্যালুতে কোথাও কোথাও একটি সম্ভাব্য সমস্যা রয়েছে যা পুরানো কী নামের একই স্ট্রিং।
মিক্স

4
"নিখুঁতভাবে" নির্দিষ্ট সংজ্ঞা দেওয়ার জন্য "পুরোপুরি কাজ করে"। নামান্তর করার চেষ্টা করুন 'a'মধ্যে { a: 1, aa: 2, aaa: 3}বা মান যে স্ট্রিং বা সংখ্যা বা Booleans চেয়ে আরো কিছু সঙ্গে একটি বস্তু নামান্তর করতে চেষ্টা করুন, অথবা সার্কুলার রেফারেন্স দিয়ে চেষ্টা।
আরএসপি

1
যদি অবজেক্টটিতে ফাংশন বা তারিখ অবজেক্ট থাকে তবে এটি কাজ করবে না
ইখসান

7

প্রতিটি কীতে উপসর্গ যুক্ত করতে:

const obj = {foo: 'bar'}

const altObj = Object.fromEntries(
  Object.entries(obj).map(([key, value]) => 
    // Modify key here
    [`x-${key}`, value]
  )
)

// altObj = {'x-foo': 'bar'}

5

আমি এরকম কিছু করব:

function renameKeys(dict, keyMap) {
  return _.reduce(dict, function(newDict, val, oldKey) {
    var newKey = keyMap[oldKey] || oldKey
    newDict[newKey] = val 
    return newDict
  }, {})
}

3
আপনার সমাধানের একটি আপডেট সংস্করণ তৈরি করেছেন যা এখানে স্থিতিশীল কীগুলিকে ' অপরিজ্ঞাপিত ' রূপান্তরিত করে না: gist.github.com/diasdavid/f8997fb0bdf4dc1c3543 তবুও, এটি JSON এর কয়েকটি স্তরে পুনর্নির্মাণ চাওয়ার সমস্যাটির উপরে পড়ে না অবজেক্ট (নেস্টেড কীগুলি পুনর্নির্মাণ), ধারণা?
ডেভিড ডায়াস

4

আমি বলব যে ধারণাগুলি দৃষ্টিকোণ থেকে পুরানো অবজেক্টটি (ওয়েব পরিষেবা থেকে একটি) যেমন রয়েছে তেমন রেখে দেওয়া এবং আপনার প্রয়োজনীয় মানগুলি একটি নতুন অবজেক্টে রাখাই ভাল। আমি ধরে নিচ্ছি যে আপনি যে কোনও উপায়ে নির্দিষ্ট ক্ষেত্রগুলি বের করছেন, ক্লায়েন্টের উপর না থাকলে, তবে সার্ভারে অন্তত। আপনি যে ক্ষেত্রের নামগুলি ওয়েব পরিষেবা থেকে সাদৃশ্যপূর্ণ, কেবল ছোট ছোট অক্ষরগুলিই ব্যবহার করতে পছন্দ করেছেন তা সত্যিই এটিকে পরিবর্তন করে না। সুতরাং, আমি এই জাতীয় কিছু করার পরামর্শ দেব:

var myObj = {
    field1: theirObj.FIELD1, 
    field2: theirObj.FIELD2,
    (etc)
}

অবশ্যই, আমি এখানে সব ধরণের অনুমান করছি, যা সত্য নাও হতে পারে। যদি এটি আপনার ক্ষেত্রে প্রযোজ্য না হয়, বা এটি খুব ধীর হয়ে থাকে (এটি কি? আমি পরীক্ষা করে দেখিনি, তবে আমি কল্পনা করি যে ক্ষেত্রের সংখ্যা বাড়ার সাথে সাথে পার্থক্যটি আরও ছোট হয়ে যায়), দয়া করে এই সমস্তটি উপেক্ষা করুন :)

আপনি যদি এটি না করতে চান, এবং আপনাকে কেবল নির্দিষ্ট ব্রাউজারগুলি সমর্থন করতেই পারেন তবে আপনি নতুন গেটারগুলি "বড় হাতের (ক্ষেত্র)" ফিরিয়ে দিতেও ব্যবহার করতে পারেন: দেখুন http://robertnyman.com/2009/05/28 / জাভাস্ক্রিপ্ট-কোড-নমুনা-এবং-গণতন্ত্র / এবং গির্জার সাথে সেটটার-এবং আরও তথ্যের জন্য সেই পৃষ্ঠায় লিঙ্কগুলি।

সম্পাদনা করুন:

অবিশ্বাস্যরূপে, এটি প্রায় দ্বিগুণ দ্রুত, কমপক্ষে আমার FF3.5 এ কাজ করে। দেখুন: http://jsperf.com/spiny001


আপনার প্রচেষ্টার জন্য আপনাকে অনেক ধন্যবাদ কিন্তু ব্যবহারের ক্ষেত্রে স্থির বস্তুগুলির কাঠামো এবং গভীরতা অজানা হিসাবে চালিত করে না। তাই সম্ভব হলে আমি প্রশ্নের মূল ক্ষেত্রের সাথে লেগে থাকতে চাই।
জিন ভিনসেন্ট

4

যদিও এটি কোনও কী-এর নামকরণের জন্য আরও ভাল সমাধান দেয় না, এটি থাকা সামগ্রীর ডেটা পরিবর্তন না করে কোনও কীতে কোনও কীতে সমস্ত কী পুনরায় নামকরণ করার জন্য দ্রুত এবং সহজ ES6 উপায় সরবরাহ করে।

let b = {a: ["1"], b:["2"]};
Object.keys(b).map(id => {
  b[`root_${id}`] = [...b[id]];
  delete b[id];
});
console.log(b);

3
এই কোডটি কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য দয়া করে সম্পাদনা লিঙ্কটি ব্যবহার করুন এবং কেবল কোডটি দেবেন না, কারণ ব্যাখ্যাটি ভবিষ্যতের পাঠকদের সহায়তা করার সম্ভাবনা বেশি। আরও দেখুন কিভাবে উত্তর দিতেউত্স
জেড ফক্স

আমি রাজী. এটি নির্দিষ্ট করে প্রশ্নের উত্তর দেয় না তবে এটি আপনাকে বস্তুর সমস্ত কীগুলির নাম পরিবর্তনের সমাধান হিসাবে কাজটি করতে সহায়তা করেছে। হতে পারে আমি বিষয়টি মিস করেছি ..
টিউডার মোোরার

3

এই পৃষ্ঠায় তালিকাবদ্ধ কয়েকটি সমাধানের কিছু পার্শ্ব প্রতিক্রিয়া রয়েছে:

  1. নীচে এটি যুক্ত করে অবজেক্টের কী এর অবস্থানকে প্রভাবিত করুন (যদি এটি আপনার কাছে গুরুত্বপূর্ণ থাকে)
  2. IE9 + এ কাজ করবে না (আবার, যদি এটি আপনার কাছে গুরুত্বপূর্ণ থাকে)

এখানে এমন একটি সমাধান রয়েছে যা কীটির অবস্থান একই জায়গায় রাখে এবং আইই 9+ এর সাথে সামঞ্জস্যপূর্ণ তবে একটি নতুন অবজেক্ট তৈরি করতে হবে এবং দ্রুততম সমাধান নাও হতে পারে:

function renameObjectKey(oldObj, oldName, newName) {
    const newObj = {};

    Object.keys(oldObj).forEach(key => {
        const value = oldObj[key];

        if (key === oldName) {
            newObj[newName] = value;
        } else {
            newObj[key] = value;
        }
    });

    return newObj;
}

দয়া করে নোট করুন: আইই 9 কঠোর মোডে প্রতিটি জন্য সমর্থন করতে পারে না


2

নাম পরিবর্তিত কীগুলি সহ একটি নতুন অবজেক্ট তৈরি করার জন্য এখানে একটি উদাহরণ।

let x = { id: "checkout", name: "git checkout", description: "checkout repository" };

let renamed = Object.entries(x).reduce((u, [n, v]) => {
  u[`__${n}`] = v;
  return u;
}, {});

2

সর্বাধিক শক্তিশালী REDUCE পদ্ধতি সহ আর একটি উপায় ।

data = {key1: "value1", key2: "value2", key3: "value3"}; 

keyMap = {key1: "firstkey", key2: "secondkey", key3: "thirdkey"};

mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});

console.log(mappedData);


1

এটি একটি ছোট পরিবর্তন যা আমি পাম্বারের কাজটি করেছিলাম; একা কোনও বস্তুর পরিবর্তে অবজেক্টের অ্যারে নিতে সক্ষম হতে এবং আপনি সূচকটি সক্রিয় করতে পারেন। এছাড়াও "কীগুলি" একটি অ্যারের দ্বারা নির্ধারিত হতে পারে

function renameKeys(arrayObject, newKeys, index = false) {
    let newArray = [];
    arrayObject.forEach((obj,item)=>{
        const keyValues = Object.keys(obj).map((key,i) => {
            return {[newKeys[i] || key]:obj[key]}
        });
        let id = (index) ? {'ID':item} : {}; 
        newArray.push(Object.assign(id, ...keyValues));
    });
    return newArray;
}

পরীক্ষা

const obj = [{ a: "1", b: "2" }, { a: "5", b: "4" } ,{ a: "3", b: "0" }];
const newKeys = ["A","C"];
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);

1

আপনার মতামত আমার মতে, অনুকূলিত। তবে আপনি পুনরায় সাজানো কী দিয়ে শেষ করবেন। নতুন তৈরি করা কী শেষে যুক্ত করা হবে। আমি জানি আপনার কখনই কী অর্ডারের উপর নির্ভর করা উচিত নয়, তবে আপনাকে যদি এটি সংরক্ষণের প্রয়োজন হয় তবে আপনাকে সমস্ত কীগুলির মধ্য দিয়ে যেতে হবে এবং সেই প্রক্রিয়া চলাকালীন প্রশ্নের কীটি প্রতিস্থাপন করে একের পর এক নতুন অবজেক্ট তৈরি করতে হবে।

এটার মত:

var new_o={};
for (var i in o)
{
   if (i==old_key) new_o[new_key]=o[old_key];
   else new_o[i]=o[i];
}
o=new_o;

0
  • আপনি এটি পরিচালনা করতে একটি ইউটিলিটি ব্যবহার করতে পারেন।
npm i paix
import { paix } from 'paix';

const source_object = { FirstName: "Jhon", LastName: "Doe", Ignored: true };
const replacement = { FirstName: 'first_name', LastName: 'last_name' };
const modified_object = paix(source_object, replacement);

console.log(modified_object);
// { Ignored: true, first_name: 'Jhon', last_name: 'Doe' };

0

এটি আপনার প্রিয় সম্পাদক <3 এ চেষ্টা করুন

const obj = {1: 'a', 2: 'b', 3: 'c'}

const OLD_KEY = 1
const NEW_KEY = 10

const { [OLD_KEY]: replaceByKey, ...rest } = obj
const new_obj = {
  ...rest,
  [NEW_KEY]: replaceByKey
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.