2016-08-27 2 views
2

У меня есть этот объект:Как изменить номер ключа?

a = {"formData": { 
    "total": "60.00", 
    "tr0_RTN": "PZH", 
    "tr0_amount": "10.00", 
    "tr2_RTN": "SUB", 
    "tr2_amount": "30.00", 
    "tr7_RTN": "KFC", 
    "tr7_amount": "20.00", 
}}; 

Как я могу изменить последовательность клавиш для этого:

a = {"formData": { 
    "total": "60.00", 
    "tr0_RTN": "PZH", 
    "tr0_amount": "10.00", 
    "tr1_RTN": "SUB", 
    "tr1_amount": "30.00", 
    "tr2_RTN": "KFC", 
    "tr2_amount": "20.00", 
}}; 

Во всяком случае я мог бы сделать это с родными или lodash?

+0

Если это происходит, как JSON строки, то вы можете использовать строку заменить метод. Если он входит в объект JS, вам необходимо создать новые свойства на основе старых значений и впоследствии удалить старые свойства. – Redu

+0

Объект. Я уже удалил часть данных объекта с помощью lodash и вам нужно переставить его. – sg552

ответ

1

Вы можете получить все соответствующие ключи, найти детали и построить новые последовательные номера.

Затем присвойте старые значения новым свойствам и удалите старые ключи.

old key  new key      action 
---------- ---------- -------------------------------------------- 
tr0_RTN  tr0_RTN  no, because old key and new key are the same 
tr0_amount tr0_amount same as above 
tr2_RTN  tr1_RTN  create new key, delete old key 
tr2_amount tr1_amount same 
tr7_RTN  tr2_RTN  same 
tr7_amount tr2_amount same 

var a = { "formData": { "total": "60.00", "tr0_RTN": "PZH", "tr0_amount": "10.00", "tr2_RTN": "SUB", "tr2_amount": "30.00", "tr7_RTN": "KFC", "tr7_amount": "20.00", } }; 
 

 
Object.keys(a.formData).filter(function (k) { 
 
    return k.indexOf('tr') === 0; 
 
}).sort(function (a, b) { 
 
    return a.match(/\d+/) - b.match(/\d+/); 
 
}).forEach(function (k) { 
 
    var m = k.match(/(\d+)_(.*)/), 
 
     kk; 
 
    if (m[1] !== this.last) { 
 
     this.counter++; 
 
     this.last = m[1]; 
 
    } 
 
    kk = 'tr' + this.counter + '_' + m[2]; 
 
    if (k !== kk) { 
 
     a.formData[kk] = a.formData[k]; 
 
     delete a.formData[k]; 
 
    } 
 
}, { counter: -1, last: '' }); 
 

 
console.log(a);

1

Я предполагаю, что у вас есть форма с тремя строками, и вы хотите изменить их. Так как индексы довольно случайны, вы можете использовать эту функцию для организации/переиндексации.

var keys = Object.keys(a["formData"]); 
var formData = {}; 
var index = 0; 

for (var i = 0; i < keys.length; i++) { 
    var key = keys[i]; 
    if (key.indexOf('tr') == 0) { 
     if (key.indexOf('_RTN') >= 0) { 
      key = 'tr' + index + '_RTN'; 
     } else if (key.indexOf('_amount') >= 0) { 
      key = 'tr' + index + '_amount'; 
     } 
     if ((formData.hasOwnProperty('tr' + index + '_RTN') 
      || formData.hasOwnProperty('tr' + index + '_amount')) 
      && !formData.hasOwnProperty(key)) { 
      index++; 
     } 
    } 
    formData[key] = a["formData"][keys[i]]; 
} 

a["formData"] = formData; 

Это восстановит ваш объект с измененными ключами для соответствующих _RTN и _amount пунктов.

1

Вы можете сделать следующим образом;

var data = {"formData": {  "total": "60.00", 
 
           "tr0_RTN": "PZH", 
 
          "tr0_amount": "10.00", 
 
           "tr2_RTN": "SUB", 
 
          "tr2_amount": "30.00", 
 
           "tr7_RTN": "KFC", 
 
          "tr7_amount": "20.00", 
 
          } 
 
      }, 
 
propsToDel = ["tr2_RTN", "tr2_amount", "tr7_RTN", "tr7_amount"], 
 
propsToIns = ["tr1_RTN", "tr1_amount", "tr2_RTN", "tr2_amount"], 
 
    newData = propsToIns.reduce((o,p,i) => { o.formData[p] = o.formData[propsToDel[i]]; 
 
              delete o.formData[propsToDel[i]]; 
 
              return o; 
 
              },data); 
 
console.log(newData);

Смежные вопросы