私はjavascriptでソートする必要があるオブジェクトの配列を持っています(es6は問題ありません)、またはjqueryです。値はサブオブジェクトにあるため、データは通常のオブジェクト配列よりも少し複雑です。ソートするデータが動的キーのオブジェクト内にある動的キーをソートする必要があります。たとえば、 'id'を昇順または降順にソートする必要があり、データはid.dataにあります。Javascriptオブジェクトのサブキーのオブジェクトの配列を並べ替えます。
[{
"_row": {},
"_parent": {},
"id": {"data": 112, "cell": {}},
"name": {"data": "D'Amore, Volkman and Cole", "cell": {}},
"check_name": {"data": "", "cell": {}},
"account_number": {"data": "5534867831801846", "cell": {}},
"main_email": {"data": "[email protected]", "cell": {}},
"cc_email": {"data": "[email protected]", "cell": {}},
"main_phone": {"data": "1-845-550-6422", "cell": {}},
"work_phone": {"data": "+1 (859) 399-6372", "cell": {}},
"mobile": {"data": "292-242-7626 x798", "cell": {}},
"fax": {"data": "", "cell": {}},
"active": {"data": 1, "cell": {}},
"billing_address": {"data": "24226 Mackenzie Junctions Suite 393\nDonaldside, GA 87531", "cell": {}},
"shipping_address": {"data": "478 Toy Loaf Suite 552\nWaelchiberg, ND 70701-3633", "cell": {}},
"comments": {"data": "", "cell": {}}
}, {
"_row": {},
"_parent": {},
"id": {"data": 120, "cell": {}},
"name": {"data": "Carroll, Rice and Reilly", "cell": {}},
"check_name": {"data": "", "cell": {}},
"account_number": {"data": "4539358256447", "cell": {}},
"main_email": {"data": "[email protected]", "cell": {}},
"cc_email": {"data": "[email protected]", "cell": {}},
"main_phone": {"data": "612-864-9512", "cell": {}},
"work_phone": {"data": "(519) 761-1805", "cell": {}},
"mobile": {"data": "+1-730-669-4339", "cell": {}},
"fax": {"data": "", "cell": {}},
"active": {"data": 1, "cell": {}},
"billing_address": {"data": "848 Rashawn Causeway\nHauckberg, GA 21193", "cell": {}},
"shipping_address": {"data": "3458 Wolff Cape Suite 336\nWolfmouth, DC 35821", "cell": {}},
"comments": {"data": "", "cell": {}}
}, {
"_row": {},
"_parent": {},
"id": {"data": 122, "cell": {}},
"name": {"data": "Denesik and Sons", "cell": {}},
"check_name": {"data": "", "cell": {}},
"account_number": {"data": "6011079688853496", "cell": {}},
"main_email": {"data": "[email protected]", "cell": {}},
"cc_email": {"data": "[email protected]", "cell": {}},
"main_phone": {"data": "569-382-2580 x1764", "cell": {}},
"work_phone": {"data": "705.782.2219", "cell": {}},
"mobile": {"data": "936-586-1978", "cell": {}},
"fax": {"data": "", "cell": {}},
"active": {"data": 1, "cell": {}},
"billing_address": {"data": "1864 Donnelly Parkway Suite 222\nPort Hailieburgh, NC 08808-0938", "cell": {}},
"shipping_address": {"data": "28476 Jerald Valleys Apt. 537\nNorth Vancemouth, DC 16865-0793", "cell": {}},
"comments": {"data": "", "cell": {}}
}, {
"_row": {},
"_parent": {},
"id": {"data": 124, "cell": {}},
"name": {"data": "Trantow, Botsford and Runolfsson", "cell": {}},
"check_name": {"data": "", "cell": {}},
"account_number": {"data": "4556163511909216", "cell": {}},
"main_email": {"data": "[email protected]", "cell": {}},
"cc_email": {"data": "[email protected]", "cell": {}},
"main_phone": {"data": "+16989316200", "cell": {}},
"work_phone": {"data": "969.610.8041 x8593", "cell": {}},
"mobile": {"data": "680.717.5368", "cell": {}},
"fax": {"data": "", "cell": {}},
"active": {"data": 1, "cell": {}},
"billing_address": {"data": "96778 VonRueden Square Suite 421\nKennafort, SC 70938", "cell": {}},
"shipping_address": {"data": "13334 Orion Green\nEast Lillieborough, ND 19714", "cell": {}},
"comments": {"data": "", "cell": {}}
}]
合併症の次のステップは、私は、その後、別のキーは、アクティブなように、名前のidでソートしたいことなど
任意のアイデアですか? .sort
を繋ぐことはできますか? (セルオブジェクトを使用していないように見えますが、私はそれを削除して人生を楽にすることができます)。最初のソートは正常に動作し、複数の列を並べ替えることは機能していないようです。
試み1:dynamicSort
はかなりクールでthenByを使用して、スタックオーバーフローSort array of objects by string property value in JavaScript
dynamicSort(property) {
let sortOrder = 1;
if (property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a, b) {
let result = (a[property].data < b[property].data) ? -1 : (a[property].data > b[property].data) ? 1 : 0;
return result * sortOrder;
}
}
試み2から引き出された
//sort_array looks like [{db_field:'asc'},etc...]
//we need to sort row based on data for this.tdo[row][db_filed]['data']
this.tdo.sort((a,b) => {
sort_array.forEach(sort => {
let keys = Object.keys(sort);
let name = keys[0];
if(sort[keys[0]] =='asc')
{
this.tdo = this.tdo.sort(this.dynamicSort(name));
}
else
{
this.tdo = this.tdo.sort(this.dynamicSort('-'+name));
}
})
})
。私はその閉鎖問題でソートスタックする方法の例を見つけました:
let sort_stack = firstBy(function (v1, v2) { return 0 });
sort_array.forEach(sort => {
let keys = Object.keys(sort);
let name = keys[0];
if(sort[keys[0]] =='asc')
{
sort_stack = sort_stack.thenBy(function (v1) { return v1[name].data; });
}
else
{
sort_stack = sort_stack.thenBy(function (v1) { return v1[name].data ; },-1);
}
})
this.tdo.sort(sort_stack);
また、私はデータの種類に基づいて、ユーザの入力サブ並べ替えを制限する必要があるかもしれません... id
のような列がしますソート一度だけ
ない私がダウン票を得た理由は、この種はかなり複雑であり、あなたがカスタム比較関数を使用してアレイ上)(連鎖の並べ替えを使用することができます.sort
ドキュメント
はい、あなたは[ '.sort'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/使用することができますソート)。あなたが記述したものとまったく同じ比較関数を書くだけです。 – Hamms
それについては何が複雑ですか? 'a.id'と' b.id'を比較するのではなく、 'a.id.data'と' b.id.data'を比較します。 –
http://www.javascriptkit.com/javatutors/arraysort2.shtml – CodingYoshi