[英]Multicriteria sorting object keys using Javascript and loadash
我試圖使用多個條件,Javascript和Lodash按鍵對對象進行排序。 我不必使用Lodash,但認為這會更容易。 我願意接受任何可行的工作。 任何幫助將不勝感激! 先感謝您。
這是我正在使用的示例對象:
var object = { "148295945589000200_149099156236000910_filter": "some value", "148295945589000200_149099156236000910_filtertype": "some_value", "148295945589000200_filter": "asdf", "149098531921500909_source": "js.content_ids", "149098531921500909_filtertype": "some_value", "148295944269000199_settovar": "", "148295945589000200_149098530604100908_source": "js.content_type", "148295945589000200_filtertype": "defined", "148295945589000200_source": "js.content_type", "148295944269000199_settotext": "adsf", "148295945589000200_149098530604100908_filter": "some value", "149099546962400202_149099548423700203_filtertype": "some_value", "149099546962400202_149099548423700203_filter": "some value", "148295945589000200_149098530604100908_filtertype": "some_value", "148295944269000199_setoption": "text", "148295944269000199_set": "js.content_name", "149099546962400202_source": "js.acme_id", "149099546962400202_149099548423700203_source": "js.acme_page", "149099546962400202_filter": "", "149098531921500909_filter": "some value", "149099546962400202_filtertype": "defined", "148295945589000200_149099156236000910_source": "js.content_name" }
這就是我想要做的:
根據每個鍵中的前18個數字對對象進行排序。 如果只有一個數字塊,首先列出,然后按順序列出系列中第二個數字塊的鍵。 然后,按鍵的剩余字母部分排序。
預期產量:
var object = { "148295944269000199_set": "js.content_name", "148295944269000199_setoption": "text", "148295944269000199_settotext": "adsf", "148295944269000199_settovar": "", "148295945589000200_filter": "asdf", "148295945589000200_filtertype": "defined", "148295945589000200_source": "js.content_type", "148295945589000200_149098530604100908_filter": "some value", "148295945589000200_149098530604100908_filtertype": "some_value", "148295945589000200_149098530604100908_source": "js.content_type", "148295945589000200_149099156236000910_filter": "some text", "148295945589000200_149099156236000910_filtertype": "some_value", "148295945589000200_149099156236000910_source": "js.content_name" "149098531921500909_filter": "some value", "149098531921500909_filtertype": "contains_ignore_case", "149098531921500909_source": "js.content_ids", "149099546962400202_filter": "", "149099546962400202_filtertype": "defined", "149099546962400202_source": "js.acme_page", "149099546962400202_149099548423700203_filter": "some value", "149099546962400202_149099548423700203_filtertype": "some_value", "149099546962400202_149099548423700203_source": "js.acme_id" }
以下是我嘗試過的一些事情:
(1)試圖添加到數組並排序
var array = Object.keys(object).sort(function(a, b) { return a.localeCompare(b); }) var newObject = {}; array.forEach(function(key) { newObject[key] = object[key]; }); JSON.stringify(object, null, 2);
(2)嘗試刪除下划線進行排序
var newObject = {}; Object.keys(object).forEach(function(key) { newKey = key.replace(/_/g, ""); newObject[newKey] = object[key]; }); var array = Object.keys(newObject).sort(function(a, b) { return a.localeCompare(b); }) var newestObject = {}; array.forEach(function(key) { newestObject[key] = newObject[key]; }); JSON.stringify(object, null, 2);
(3)嘗試使用lodash(用“_”調用)轉換為多維數組並使用多標准排序 - 我認為我最接近這個,也許。 這需要lodash工作 - https://raw.githubusercontent.com/lodash/lodash/4.17.4/dist/lodash.core.js
var sortable = _.toPairs(object); var array = sortable.sort(function(a, b) { // check if b[0].substring(19,37) is a number first? if (a[0].substring(0, 18) === b[0].substring(0, 18)) { var x = a[1].substring(0, 18), y = b[1].substring(0, 18); return x < y ? -1 : x > y ? 1 : 0; } return a[0].substring(0, 18) - b[0].substring(0, 18); }); var output = _.fromPairs(array); JSON.stringify(output, null, 2);
我們可以通過以下方式解決
lodash#toPairs
將對象轉換為鍵值對的lodash#toPairs
。 lodash#sortBy
按鍵對集合進行排序:
'_'
分隔符分割鍵字符串並獲得它的length
。 '_'
字符替換為拆分的length
。 lodash#fromPairs
將已排序的集合轉換為對象。 var result = _(object)
.toPairs()
.sortBy(function(pair) {
return pair[0].replace(/_/, pair[0].split('_').length);
})
.fromPairs()
.value();
var object = { "148295945589000200_149099156236000910_filter": "some value", "148295945589000200_149099156236000910_filtertype": "some_value", "148295945589000200_filter": "asdf", "149098531921500909_source": "js.content_ids", "149098531921500909_filtertype": "some_value", "148295944269000199_settovar": "", "148295945589000200_149098530604100908_source": "js.content_type", "148295945589000200_filtertype": "defined", "148295945589000200_source": "js.content_type", "148295944269000199_settotext": "adsf", "148295945589000200_149098530604100908_filter": "some value", "149099546962400202_149099548423700203_filtertype": "some_value", "149099546962400202_149099548423700203_filter": "some value", "148295945589000200_149098530604100908_filtertype": "some_value", "148295944269000199_setoption": "text", "148295944269000199_set": "js.content_name", "149099546962400202_source": "js.acme_id", "149099546962400202_149099548423700203_source": "js.acme_page", "149099546962400202_filter": "", "149098531921500909_filter": "some value", "149099546962400202_filtertype": "defined", "148295945589000200_149099156236000910_source": "js.content_name" }; var result = _(object) .toPairs() .sortBy(function(pair) { return pair[0].replace(/_/, pair[0].split('_').length); }) .fromPairs() .value(); console.log(result);
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
或者,您可以在不使用lodash的情況下解決此問題:
function getKey(key) {
return key.replace(/_/, key.split('_').length);
}
var result = Object.keys(object)
.sort(function(k1, k2) {
return getKey(k1).localeCompare(getKey(k2));
})
.reduce(function(acc, key) {
acc[key] = object[key];
return acc;
}, {});
var object = { "148295945589000200_149099156236000910_filter": "some value", "148295945589000200_149099156236000910_filtertype": "some_value", "148295945589000200_filter": "asdf", "149098531921500909_source": "js.content_ids", "149098531921500909_filtertype": "some_value", "148295944269000199_settovar": "", "148295945589000200_149098530604100908_source": "js.content_type", "148295945589000200_filtertype": "defined", "148295945589000200_source": "js.content_type", "148295944269000199_settotext": "adsf", "148295945589000200_149098530604100908_filter": "some value", "149099546962400202_149099548423700203_filtertype": "some_value", "149099546962400202_149099548423700203_filter": "some value", "148295945589000200_149098530604100908_filtertype": "some_value", "148295944269000199_setoption": "text", "148295944269000199_set": "js.content_name", "149099546962400202_source": "js.acme_id", "149099546962400202_149099548423700203_source": "js.acme_page", "149099546962400202_filter": "", "149098531921500909_filter": "some value", "149099546962400202_filtertype": "defined", "148295945589000200_149099156236000910_source": "js.content_name" }; function getKey(key) { return key.replace(/_/, key.split('_').length); } var result = Object.keys(object) .sort(function(k1, k2) { return getKey(k1).localeCompare(getKey(k2)); }) .reduce(function(acc, key) { acc[key] = object[key]; return acc; }, {}); console.log(result);
body > div { min-height: 100%; top: 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.