2017-12-07 16 views
2

配列オブジェクトのキーで指定された整数値を使用して、次の配列を別の配列に整理するにはどうすればよいですか?整数を含むキー文字列で配列を整理する方法

[ 
    { 
    "itemQty_0": "443" 
    }, 
    { 
    "itemDescription_0": "Et aspernatur aspernatur qui sed ut do enim vel dignissimos libero nisi aut adipisci pariatur Est" 
    }, 
    { 
     "itemCapCheckbox_0": "on" 
    }, 
    { 
    "itemQty_1": "44" 
    }, 
    { 
    "itemDescription_1": "44" 
    } 
] 

この配列を次のような別の配列に整理するにはどうすればよいですか?

items: [{ 
    itemDescription: stringValue, 
    itemQty: integerValue, 
    itemCapCheckBox: 'on/off' 
},{ 
    itemDescription: stringValue, 
    itemQty: integerValue, 
    itemCapCheckBox: 'on/off' 
}] 

答えて

3
const result = []; 

for(const obj of items){ 
    const keyId = Object.keys(obj)[0], [key, id] = keyId.split("_"); 
    if(result[id]){ 
    result[id][key] = obj[keyId]; 
    }else{ 
    result[id] = { [key] : obj[keyId] }; 
    } 
} 
1

あなたはMapに配列を削減し、オブジェクトに同じインデックスを持つプロパティを収集することができます。その後spreadmap valuesが配列に戻ります。

キーを見つけるには、Object#keysを使用してキーの配列を取得し、1番目(1つのみ)を取得します。その後、キーをアンダースコアで分割してプロパティ名とインデックスを取得します。

const items = [{"itemQty_0":"443"},{"itemDescription_0":"Et aspernatur aspernatur qui sed ut do enim vel dignissimos libero nisi aut adipisci pariatur Est"},{"itemCapCheckbox_0":"on"},{"itemQty_1":"44"},{"itemDescription_1":"44"}]; 
 

 
const result = [...items.reduce((m, o) => { 
 
    const oKey = Object.keys(o)[0]; // get the key 
 
    
 
    const [prop, index] = oKey.split('_'); // get the prop name and the index 
 

 
    m.has(index) || m.set(index, {}); // if index doesn't exist in the map, and a new entry 
 
    
 
    m.get(index)[prop] = o[oKey]; // get the object by the index, and assign the value to the prop 
 
    
 
    return m; 
 
}, new Map()).values()]; 
 

 
console.log(result);

1

あなたは、キーとインデックス部のキーを分割することにより、アレイを減らすことができます。

var array = [{ itemQty_0: "443" }, { itemDescription_0: "Et aspernatur aspernatur qui sed ut do enim vel dignissimos libero nisi aut adipisci pariatur Est" }, { itemCapCheckbox_0: "on" }, { itemQty_1: "44" }, { itemDescription_1: "44" }], 
 
    grouped = array.reduce(function (r, o) { 
 
     var key = Object.keys(o)[0], 
 
      keys = key.split('_'); 
 

 
     r[keys[1]] = r[keys[1]] || {}; 
 
     r[keys[1]][keys[0]] = o[key]; 
 
     return r; 
 
    }, []); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ヘイニーナ。 r [keys [1]] = r [keys [1]] ||を理解するのを手伝ってください。 {}; '? –

+0

は、インデックスを持つオブジェクトが存在するかどうかをチェックし、存在しない場合はオブジェクトを作成します。 –

+0

私が混乱しているのは、アキュムレータの初期値が[]であるようです。だから、私はアキュムレータがインデックス0の値を探していて、それを見つけることができないので、[]から{}に初期値を設定しますか? –

0

[OK]を、私たちはより多くのあなたが欲しい答えのように見える構造にオブジェクトの配列を集約する必要があり、このためのよう。おそらくArray.reduceを使用したいと考えています。

function ReduceItemToArray(acc, item){ 
    var key = Object.keys(item)[0]; //Get the key (eg "itemQty_1") 
    var [newKey, index] = key.split("_"); //Get newkey and index from key ("itemQty" and "1" respectively) 
    var newAcc = [...acc]; //make a copy of the current accumulator 
    if(newAcc[Number(index)] === undefined) //If there is no bucket on that index, make an empty one 
    newAcc[Number(index)] = {}; 
    newAcc[Number(index)][newKey] = item[key]; //Add the item 
    return newAcc; //Return the new item 
} 

var items = input.reduce(ReduceItemToArray, []); 

希望に役立ちます。 :)

+0

なぜ{}の代わりに[]を初期値として送信しますか? –

+0

'.reduce()'関数から返ってきた項目は配列なので、私は初期値を渡す必要があるので、空の配列を渡すだけです。結局、 'items'は常に配列になります。 –

関連する問題