簡體   English   中英

使用Javascript和loadash對多標准排序對象鍵

[英]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); 

我們可以通過以下方式解決

  1. 使用lodash#toPairs將對象轉換為鍵值對的lodash#toPairs
  2. 使用lodash#sortBy按鍵對集合進行排序:
    • '_'分隔符分割鍵字符串並獲得它的length
    • 將鍵字符串中第一個出現的'_'字符替換為拆分的length
  3. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM