क्या जावास्क्रिप्ट ऑब्जेक्ट में एक कुंजी का नाम बदलने का एक चतुर (यानी अनुकूलित) तरीका है?
एक गैर-अनुकूलित तरीका होगा:
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
आपके प्रश्न के संबंध में अप्रासंगिक है।
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
})
Yazeed Bzadough https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd द्वारा गहन व्याख्या
यहाँ अधिकांश उत्तर JS Object की-वैल्यू पेयर ऑर्डर को बनाए रखने में विफल हैं। यदि आपके पास स्क्रीन पर ऑब्जेक्ट कुंजी-मूल्य जोड़े का एक रूप है जिसे आप संशोधित करना चाहते हैं, उदाहरण के लिए, ऑब्जेक्ट प्रविष्टियों के क्रम को संरक्षित करना महत्वपूर्ण है।
JS ऑब्जेक्ट के माध्यम से लूपिंग का ES6 तरीका और नई जोड़ी के साथ की-वैल्यू पेयर को बदलने के साथ संशोधित कुंजी का नाम कुछ इस प्रकार होगा:
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}
या मूल्यों है कि तार या नंबर या बूलियन्स से ज्यादा कुछ भी कर रहे हैं के साथ एक वस्तु का नाम बदलने का प्रयास करें, या वृत्तीय संदर्भ के साथ प्रयास करें।
मैं ऐसा कुछ करूँगा:
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 देखें अधिक जानकारी के लिए उस पृष्ठ पर / geters-and-setters-with-javascript-code-नमूने-and-demos / और लिंक।
संपादित करें:
अविश्वसनीय रूप से, यह भी लगभग दो बार तेज है, कम से कम मेरे FF3.5 पर काम पर। देखें: http://jsperf.com/spiny001
हालांकि यह कुंजी का नाम बदलने के लिए एक बेहतर समाधान नहीं देता है, लेकिन यह एक त्वरित और आसान ईएस 6 तरीका प्रदान करता है जो किसी ऑब्जेक्ट में सभी कुंजी का नाम बदलने के लिए होता है, जिसमें वे शामिल नहीं होते हैं।
let b = {a: ["1"], b:["2"]};
Object.keys(b).map(id => {
b[`root_${id}`] = [...b[id]];
delete b[id];
});
console.log(b);
इस पृष्ठ पर सूचीबद्ध कुछ समाधानों के कुछ दुष्प्रभाव हैं:
यहां एक समाधान है जो कुंजी की स्थिति को उसी स्थान पर रखता है और IE9 + में संगत है, लेकिन एक नई वस्तु बनाना है और सबसे तेज समाधान नहीं हो सकता है:
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;
}
कृपया ध्यान दें: IE9 सख्त मोड में आगे का समर्थन नहीं कर सकता है
फिर भी सबसे शक्तिशाली 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);
मेरी राय में आपका रास्ता अनुकूलित है। लेकिन आप reordered कीज़ के साथ समाप्त होंगे। नई बनाई गई कुंजी अंत में संलग्न की जाएगी। मुझे पता है कि आपको कभी भी महत्वपूर्ण आदेश पर भरोसा नहीं करना चाहिए, लेकिन अगर आपको इसे संरक्षित करने की आवश्यकता है, तो आपको सभी कुंजियों से गुजरना होगा और एक-एक करके नई वस्तु का निर्माण करना होगा, उस प्रक्रिया के दौरान प्रश्न की कुंजी को बदलना होगा।
ऐशे ही:
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' };