2016-08-27 11 views
2

私は、このオブジェクトを持っている:とにかく、私は、ネイティブまたはlodashでこれを行うことができキー番号を変更するには?

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

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

は、どのように私はこれにキーシーケンスを変更することができますか?

+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

あなたはtr行のフォームを持っていて、それらを並べ替えたいと思っています。 indecesは非常にランダムなので、この関数を使用してそれらを整理/再インデックスすることができます。

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

関連する問題