Rumah > Soal Jawab > teks badan
P粉4097421422023-08-25 18:44:16
Penyelesaian ES6 menggunakan objek Peta:
function groupBy(arr, key) { return arr.reduce( (sum, item) => { const groupByVal = item[key]; groupedItems = sum.get(groupByVal) || []; groupedItems.push(item); return sum.set(groupByVal, groupedItems); }, new Map() ); } var Data = [ { Id: 1, Name: 'Red', optionName: 'Color' }, { Id: 2, Name: 'Yellow', optionName: 'Color' }, { Id: 3, Name: 'Blue', optionName: 'Color' }, { Id: 4, Name: 'Green', optionName: 'Color' }, { Id: 7, Name: 'Black', optionName: 'Color' }, { Id: 8, Name: 'S', optionName: 'Size' }, { Id: 11, Name: 'M', optionName: 'Size' }, { Id: 12, Name: 'L', optionName: 'Size' }, { Id: 13, Name: 'XL', optionName: 'Size' }, { Id: 14, Name: 'XXL', optionName: 'Size' } ]; document.getElementById("showArray").innerHTML =JSON.stringify([...groupBy(Data, 'optionName')], null, 4);
<pre id="showArray"></pre>
P粉2983052662023-08-25 15:50:49
Berikut ialah coretan kod yang saya tulis untuk situasi ini. Anda boleh menambah fungsi ini pada semua tatasusunan:
Object.defineProperty(Array.prototype, 'group', { enumerable: false, value: function (key) { var map = {}; this.forEach(function (e) { var k = key(e); map[k] = map[k] || []; map[k].push(e); }); return Object.keys(map).map(function (k) { return {key: k, data: map[k]}; }); } });
Anda boleh menggunakannya seperti ini. Anda hanya lulus fungsi yang mentakrifkan cara mengumpulkan data.
var newArray = arr.group(function (item) { return item.optionName; });
Anda boleh {key: k, data: map[k]}
替换为{Name: k, Data: map[k]}
jika perlu.
Ini juga versi ES6 yang lebih padat bagi kod di atas:
Object.defineProperty(Array.prototype, 'group', { enumerable: false, value: function (key) { let map = {}; this.map(e => ({k: key(e), d: e})).forEach(e => { map[e.k] = map[e.k] || []; map[e.k].push(e.d); }); return Object.keys(map).map(k => ({key: k, data: map[k]})); } });
Gunakannya seperti ini:
let newArray = arr.group(item => item.optionName))