জাভাস্ক্রিপ্ট অবজেক্টে কীটির নতুন নামকরণের জন্য কি কোনও চতুর (অর্থাত্ত অনুকূলিত) উপায় আছে?
একটি অপ-অপ্টিমাইজড উপায় হ'ল:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
জাভাস্ক্রিপ্ট অবজেক্টে কীটির নতুন নামকরণের জন্য কি কোনও চতুর (অর্থাত্ত অনুকূলিত) উপায় আছে?
একটি অপ-অপ্টিমাইজড উপায় হ'ল:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
উত্তর:
এটি করার সর্বাধিক সম্পূর্ণ (এবং সঠিক) উপায় হ'ল, আমি বিশ্বাস করি:
if (old_key !== new_key) {
Object.defineProperty(o, new_key,
Object.getOwnPropertyDescriptor(o, old_key));
delete o[old_key];
}
এই পদ্ধতিটি নিশ্চিত করে যে নাম পরিবর্তিত সম্পত্তিটি মূলটির সাথে একই রকম আচরণ করে ।
এছাড়াও, এটি আমার কাছে মনে হয় যে এটি কোনও ফাংশন / পদ্ধতিতে মোড়ানোর এবং এটি প্রয়োগ করার সম্ভাবনাটি Object.prototype
আপনার প্রশ্নের সাথে সম্পর্কিত নয় ant
if (old_key !== new_key)
হবে: if (old_key !== new_key && o[old_key])
আপনি কোনও ফাংশনে কাজটি মোড়ানো করতে পারেন এবং এটিকে 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;
}
}
);
Object.defineProperty
।
hasOwnProperty
সম্পত্তি এবং for ... in
লুপগুলির মধ্যে সর্বদা পরীক্ষা করার জন্য সর্বদা ব্যবহার করা যথাযথ অনুশীলন হয় , তবে আমরা যদি অবজেক্টটি প্রসারিত করি তবে এটি কেন গুরুত্বপূর্ণ?
আপনি যদি আপনার উত্স অবজেক্টটি পরিবর্তন করছেন তবে ES6 এটি এক লাইনে করতে পারে।
delete Object.assign(o, {[newKey]: o[oldKey] })[oldKey];
অথবা দুটি লাইন যদি আপনি একটি নতুন অবজেক্ট তৈরি করতে চান।
const newObject = {};
delete Object.assign(newObject, o, {[newKey]: o[oldKey] })[oldKey];
[]
চারদিকে চৌকো বন্ধনী কেন newKey
? সমাধান আসলে ছাড়া কাজ করে।
যদি কারও বৈশিষ্ট্যের তালিকার নাম পরিবর্তন করতে হয়:
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"}
my_object_property
করার myObjectProperty
অবশ্য যদি আমার সম্পত্তি একক ভাষায় হলেন, তখন কী সরানো হয়েছে। +1
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"}
আপনি যদি নিজের ডেটা পরিবর্তন করতে না চান তবে এই ফাংশনটি বিবেচনা করুন ...
renameProp = (oldProp, newProp, {[oldProp]:old, ...others}) => ({
[newProp]: old,
...others
})
ইয়াজিদ বাজাডোফের একটি সম্পূর্ণ ব্যাখ্যা https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd
এখানে বেশিরভাগ উত্তর জেএস অবজেক্ট কী-মান জোড় ক্রম বজায় রাখতে ব্যর্থ। আপনি যদি স্ক্রিনে অবজেক্ট কী-মান জোড়ার একটি ফর্ম থাকে যা আপনি সংশোধন করতে চান, উদাহরণস্বরূপ, অবজেক্ট এন্ট্রিগুলির ক্রম সংরক্ষণ করা গুরুত্বপূর্ণ।
জেএস অবজেক্টের মধ্য দিয়ে লুপিংয়ের এবং 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] }
}
});
সমাধানটি পুরানোটির জায়গায় নতুন এন্ট্রি যুক্ত করে প্রবেশের ক্রম সংরক্ষণ করে।
আপনি লোডাশ চেষ্টা করতে পারেন _.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>
অবজেক্ট ডেস্ট্রাকচারিং এবং স্প্রেড অপারেটর ব্যবহার করে একটি প্রকরণ:
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};
ব্যক্তিগতভাবে, অতিরিক্ত ভারী প্লাগইন এবং চাকা প্রয়োগ না করে অবজেক্টে কীগুলির নামকরণের সবচেয়ে কার্যকর উপায়:
var str = JSON.stringify(object);
str = str.replace(/oldKey/g, 'newKey');
str = str.replace(/oldKey2/g, 'newKey2');
object = JSON.parse(str);
try-catch
আপনার অবজেক্টের অবৈধ কাঠামো থাকলে আপনি এটিকে মোড়ানোও করতে পারেন। পুরোপুরি কাজ করে :)
'a'
মধ্যে { a: 1, aa: 2, aaa: 3}
বা মান যে স্ট্রিং বা সংখ্যা বা Booleans চেয়ে আরো কিছু সঙ্গে একটি বস্তু নামান্তর করতে চেষ্টা করুন, অথবা সার্কুলার রেফারেন্স দিয়ে চেষ্টা।
আমি এরকম কিছু করব:
function renameKeys(dict, keyMap) {
return _.reduce(dict, function(newDict, val, oldKey) {
var newKey = keyMap[oldKey] || oldKey
newDict[newKey] = val
return newDict
}, {})
}
আমি বলব যে ধারণাগুলি দৃষ্টিকোণ থেকে পুরানো অবজেক্টটি (ওয়েব পরিষেবা থেকে একটি) যেমন রয়েছে তেমন রেখে দেওয়া এবং আপনার প্রয়োজনীয় মানগুলি একটি নতুন অবজেক্টে রাখাই ভাল। আমি ধরে নিচ্ছি যে আপনি যে কোনও উপায়ে নির্দিষ্ট ক্ষেত্রগুলি বের করছেন, ক্লায়েন্টের উপর না থাকলে, তবে সার্ভারে অন্তত। আপনি যে ক্ষেত্রের নামগুলি ওয়েব পরিষেবা থেকে সাদৃশ্যপূর্ণ, কেবল ছোট ছোট অক্ষরগুলিই ব্যবহার করতে পছন্দ করেছেন তা সত্যিই এটিকে পরিবর্তন করে না। সুতরাং, আমি এই জাতীয় কিছু করার পরামর্শ দেব:
var myObj = {
field1: theirObj.FIELD1,
field2: theirObj.FIELD2,
(etc)
}
অবশ্যই, আমি এখানে সব ধরণের অনুমান করছি, যা সত্য নাও হতে পারে। যদি এটি আপনার ক্ষেত্রে প্রযোজ্য না হয়, বা এটি খুব ধীর হয়ে থাকে (এটি কি? আমি পরীক্ষা করে দেখিনি, তবে আমি কল্পনা করি যে ক্ষেত্রের সংখ্যা বাড়ার সাথে সাথে পার্থক্যটি আরও ছোট হয়ে যায়), দয়া করে এই সমস্তটি উপেক্ষা করুন :)
আপনি যদি এটি না করতে চান, এবং আপনাকে কেবল নির্দিষ্ট ব্রাউজারগুলি সমর্থন করতেই পারেন তবে আপনি নতুন গেটারগুলি "বড় হাতের (ক্ষেত্র)" ফিরিয়ে দিতেও ব্যবহার করতে পারেন: দেখুন http://robertnyman.com/2009/05/28 / জাভাস্ক্রিপ্ট-কোড-নমুনা-এবং-গণতন্ত্র / এবং গির্জার সাথে সেটটার-এবং আরও তথ্যের জন্য সেই পৃষ্ঠায় লিঙ্কগুলি।
সম্পাদনা করুন:
অবিশ্বাস্যরূপে, এটি প্রায় দ্বিগুণ দ্রুত, কমপক্ষে আমার FF3.5 এ কাজ করে। দেখুন: http://jsperf.com/spiny001
যদিও এটি কোনও কী-এর নামকরণের জন্য আরও ভাল সমাধান দেয় না, এটি থাকা সামগ্রীর ডেটা পরিবর্তন না করে কোনও কীতে কোনও কীতে সমস্ত কী পুনরায় নামকরণ করার জন্য দ্রুত এবং সহজ ES6 উপায় সরবরাহ করে।
let b = {a: ["1"], b:["2"]};
Object.keys(b).map(id => {
b[`root_${id}`] = [...b[id]];
delete b[id];
});
console.log(b);
এই পৃষ্ঠায় তালিকাবদ্ধ কয়েকটি সমাধানের কিছু পার্শ্ব প্রতিক্রিয়া রয়েছে:
এখানে এমন একটি সমাধান রয়েছে যা কীটির অবস্থান একই জায়গায় রাখে এবং আইই 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 কঠোর মোডে প্রতিটি জন্য সমর্থন করতে পারে না
সর্বাধিক শক্তিশালী 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);
এটি একটি ছোট পরিবর্তন যা আমি পাম্বারের কাজটি করেছিলাম; একা কোনও বস্তুর পরিবর্তে অবজেক্টের অ্যারে নিতে সক্ষম হতে এবং আপনি সূচকটি সক্রিয় করতে পারেন। এছাড়াও "কীগুলি" একটি অ্যারের দ্বারা নির্ধারিত হতে পারে
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);
আপনার মতামত আমার মতে, অনুকূলিত। তবে আপনি পুনরায় সাজানো কী দিয়ে শেষ করবেন। নতুন তৈরি করা কী শেষে যুক্ত করা হবে। আমি জানি আপনার কখনই কী অর্ডারের উপর নির্ভর করা উচিত নয়, তবে আপনাকে যদি এটি সংরক্ষণের প্রয়োজন হয় তবে আপনাকে সমস্ত কীগুলির মধ্য দিয়ে যেতে হবে এবং সেই প্রক্রিয়া চলাকালীন প্রশ্নের কীটি প্রতিস্থাপন করে একের পর এক নতুন অবজেক্ট তৈরি করতে হবে।
এটার মত:
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;
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' };