Javascript: obyektin adını dəyişin

Bir javascript obyektində bir adını dəyişmək üçün ağıllı (yəni optimallaşdırılmış) bir yol varmı?

Optimallaşdırılmamış yol:

 o[ new_key ] = o[ old_key ]; delete o[ old_key ]; 
193
10 янв. Jan Vincent tərəfindən təyin olunan Jan 10 2011-01-10 17:29 '11 at 17:29 2011-01-10 17:29
@ 15 cavab

Bunu etmək üçün ən tam (düzgün) yol olacaq, inandığım:

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

Bu metod, adının dəyişdirildiyi xüsusiyyətin özündən asılı olduğunu təmin edir.

Bundan əlavə, mənə bir funksiyanı / metodla Object.prototypeObject.prototype -də qoymaq qabiliyyətinin sizin sualınız üçün vacib olmadığını Object.prototype .

142
30 янв. Cavab Valeriu Paloş tərəfindən verilir 30 yanvar 2013-01-30 00:17 '13 at 0:17 2013-01-30 00:17

Siz işi bir funksiyaya sarın və Object prototipinə ata bilərsiniz. Yəqin ki, bir neçə redaktə etmək üçün pulsuz interfeysdən istifadə edin.

 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 dəqiqləşdirilməsi

border=0

Sintaksisin çox mürəkkəb olmamaq istərdim, amma əlbəttə ki, bir çox nəzarət ilə.

 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; } } ); 
84
10 янв. Cavab ChaosPandion 10 Yanvar verilir 2011-01-10 18:32 '11 at 18:32 'da 2011-01-10 18:32

Kimsə mülkiyyət siyahısının adını dəyişdirməlidirsə:

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

İstifadə edin:

 const obj = { a: "1", b: "2" }; const newKeys = { a: "A", c: "C" }; const renamedObj = renameKeys(obj, newKeys); console.log(renamedObj); // {A:"1", b:"2"} 
22
24 июля '17 в 21:24 2017-07-24 21:24 Cavab 24 İyul, '17 'də 21:24 2017-07-24 21:24' də pomber verilir

Əgər mənbə obyektini dəyişirsinizsə, ES6 bunu bir xəttdə edə bilər.

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

Və ya yeni bir obyekt yaratmaq istəyirsinizsə, iki xətt.

 const newObject = {}; delete Object.assign(newObject, o, {[newKey]: o[oldKey] })[oldKey]; 
21
30 апр. Apr 30-da nverba tərəfindən verilmiş cavab 2018-04-30 16:52 '18 saat 04:52 'da 2018-04-30 16:52

Yalnız ES6(ES2015) metodundan istifadə etmək ES6(ES2015) !

biz vaxtlarla ayaqlaşmalıyıq!

13
10 нояб. Cavab xgqfrms-gildata verilir 10 noyabr. 2017-11-10 09:12 '17 'da 9:12' də 2017-11-10 09:12 'də

Mən belə bir şey edərdim:

 function renameKeys(dict, keyMap) { return _.reduce(dict, function(newDict, val, oldKey) { var newKey = keyMap[oldKey] || oldKey newDict[newKey] = val return newDict }, {}) } 
4
28 июля '15 в 2:05 2015-07-28 02:05 Cavab verilir 28 İyul, '15 'də 2:05' də 2015-07-28 02:05

Mən deyərdim ki, yeni bir obyektdə zəruri dəyərləri olduğu kimi köhnə obyektdən (veb xidmətindən birinə) buraxmaq üçün konseptual baxımdan daha yaxşı olardı. Hesab edirəm ki, bir yerdə və ya istənilən halda müəyyən sahələri çıxarırsınız, əgər müştəri yoxdursa, ən azı server. Veb xidmətində olduğu kimi, yalnız kiçik bir sahədə adları seçdiyiniz həqiqətən bunu dəyişmir. Beləliklə, sizə belə bir şey etməyi məsləhət görürəm:

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

Əlbəttə ki, burada mən səhv ola biləcək hər cür fərziyyələr yaradıram. Əgər bu sizin üçün tətbiq edilmirsə və ya çox yavaşsa (yoxsa yoxsa bunu test etmədi, amma hesab edirəm ki, fərqlər sahələrin sayı artdıqca kiçik olur).

Bunu etmək istəmirsinizsə və yalnız müəyyən brauzerləri dəstəkləməlisinizsə, "böyük (sahə)" qayıtmaq üçün yeni alıcılar da istifadə edə bilərsiniz: http://robertnyman.com/2009/05/28/getters- Daha ətraflı məlumat üçün bu səhifədəki linkləri və-javascript-kod-nümunələri-və-demoları-və-setters .

EDIT:

İnanılmaz, bu da demək olar ki, iki dəfə sürətli, ən azı mənim FF3.5 işində. Bax: http://jsperf.com/spiny001

3
11 янв. Cavab 11 Yanvarda Spiny Norman tərəfindən verilir . 2011-01-11 11:27 '11 'da 11:27' də 2011-01-11 11:27

Verilərinizi dəyişdirmək istəmirsinizsə, bu xüsusiyyəti nəzərə alın ...

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

Yezid Bzadouun tam izahı https://medium.com/front-end-hacking/immubly-rename-object-keys-in-javascript-5f6353c7b6dd


3
24 апр. Cavab verildi Mulhoon Apr 24 2018-04-24 17:40 '18 də 5:40 'də 2018-04-24 17:40' də

Bu səhifədəki bəzi həllər bəzi yan təsirlərə malikdir:

  1. obyektin əsas mövqeyini təsir edir, aşağıda əlavə edir (sizə vacibdirsə)
  2. IE9 + -da işləməyəcəkdir (yenə də, bu sizə vacibdirsə)

Burada eyni yerdə saxlayır və IE9 + ilə uyğun bir həlldir, lakin yeni bir obyekt yaratmalı və ən sürətli həlli ola bilməz:

 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; } 

Xahiş edirik qeyd edin: IE9, hər kəs üçün ciddi rejimdə dəstək ola bilməz.

2
19 марта '18 в 13:37 2018-03-19 13:37 Cavab Jasdeep Khalsa tərəfindən 19 Mart '18 'də 13:37' də 2018-03-19 13:37 'də verilir

Anahtarın adını dəyişdirmək üçün daha yaxşı bir həll təqdim etməməsinə baxmayaraq, ES6-nın özündə olan məlumatları dəyişdirmədən obyektin bütün düymələrini dəyişmək üçün tez və asan bir yol təqdim edir.

 let b = {a: ["1"], b:["2"]}; Object.keys(b).map(id => { b[`root_${id}`] = [...b[id]]; delete b[id]; }); console.log(b); 
1
27 янв. Tudor Morar tərəfindən cavabı Jan 27 2017-01-27 17:10 '17 saat 17:10 'da 2017-01-27 17:10

Yenidən adlandırılmış düymələri olan yeni bir obyekt yaratmaq üçün nümunə.

 let x = { id: "checkout", name: "git checkout", description: "checkout repository" }; let renamed = Object.entries(x).reduce((u, [n, v]) => { u['__${n}'] = v; return u; }, {}); 
1
27 нояб. cavab 张 张 伟 27 Noyabr. 2018-11-27 05:41 '18 at 5:41, 2018-11-27 05:41

Şəxsən, xüsusilə ağır plug-ins və təkərlərin tətbiqi olmadan bir obyektin düymələrini yenidən adlandırmaq üçün ən təsirli üsul:

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

Nesnenizin yanlış bir quruluşa malik olmasına baxmayaraq onu sınamaqla try-catch bilərsiniz. Böyük işləyir :)

0
26 янв. Novitoll 26 yanvar cavab verdi 2016-01-26 14:12 '16 saat 14:12 'də 2016-01-26 14:12

Siz _.mapKeys _.mapKeys cəhd edə bilərsiniz.

 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script> 
0
29 нояб. Cavab Yi-Ting Liu tərəfindən 29 Noyabrda verilir. 2018-11-29 10:17 '18 saat 10:17 'da 2018-11-29 10:17

Yenidən qurulma və paylama operatorunun obyektindən istifadə etmək imkanı:

  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 shorthand properties **kA, kB, kC**; // spread the remaining properties in the **rest** variable const newObj = {kA, kB, kC, ...rest}; 
0
13 дек. Jeff Lowery tərəfindən verilmiş cavab 13 Dekabr. 2018-12-13 03:54 '18, 3:54 'də 2018-12-13 03:54

Bu pomber funksiyası üçün edilən kiçik bir dəyişiklikdir; Bir obyektin əvəzinə bir sıra obyektlər ala bilmək üçün index də aktivləşdirə bilərsiniz. Ayrıca "Keys" array ilə təyin edilə bilər

 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; } 

test vəzifəsi

 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); 
0
31 авг. Cavab verilir Jasp402 31 av . 2018-08-31 18:59 '18 'də 18:59' də 2018-08-31 18:59

tags ilə əlaqədar digər suallar və ya sual verin