JS中多層次排序算法的實(shí)現(xiàn)代碼
引子
排序在編程中隨處可見(jiàn),從開(kāi)始學(xué)習(xí)變成,到項(xiàng)目開(kāi)發(fā),基本上或多或少會(huì)遇到一些排序問(wèn)題,接下來(lái)我要寫的是我在實(shí)際開(kāi)發(fā)終于到的一個(gè)排序問(wèn)題,一開(kāi)始卡了我很久,后面隨著知識(shí)積累,實(shí)踐變多才解決掉了,不知道是不是我搜索關(guān)鍵字不對(duì),還是其他原因,百度也沒(méi)有找到這方面的內(nèi)容。
數(shù)據(jù)結(jié)構(gòu)和需求
var arr = [ { "soNumber" : "52085848", "item" : "313281", "amount" : "3" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "10" }, { "soNumber" : "52085848", "item" : "313330", "amount" : "5" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "4" }, { "soNumber" : "52085843", "item" : "313338", "amount" : "13" }, { "soNumber" : "52085843", "item" : "422784", "amount" : "108" } ]
數(shù)據(jù)結(jié)構(gòu)如上,數(shù)組結(jié)構(gòu),每個(gè)數(shù)組元素由對(duì)象構(gòu)成,soNumber代表采購(gòu)訂單編號(hào),item代表物料,現(xiàn)需求是soNumber(采購(gòu)訂單編號(hào))從小到大排序,且基于相同的采購(gòu)訂單下的物料數(shù)據(jù)編號(hào)需要從小到大排列。
兩層排序?qū)崿F(xiàn)代碼
解決思路:
先將soNumber按從小到大的順序整理成數(shù)組,然后以銷售訂單數(shù)組為外層循環(huán),實(shí)際數(shù)據(jù)為內(nèi)層循環(huán),引入一個(gè)中間數(shù)組,中間數(shù)組中的item從小到大排序,最后按順序?qū)⑺械闹虚g數(shù)組元素放入新數(shù)組中。
實(shí)現(xiàn)代碼:
/** * 兩層排序算法 */ function multilayerSorting() { var arr = [ { "soNumber" : "52085848", "item" : "313281", "amount" : "3" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "10" }, { "soNumber" : "52085848", "item" : "313330", "amount" : "5" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "4" }, { "soNumber" : "52085843", "item" : "313338", "amount" : "13" }, { "soNumber" : "52085843", "item" : "422784", "amount" : "108" } ] // 整理soNumber成數(shù)組,并且從小到大排列 var soData = getSoData(arr); var newData = []; for ( var i in soData) { var midData = [] for ( var j in arr) { if (soData[i] == arr[j].soNumber) { midData.push(arr[j]); } } midData = midData.sort(function(obj1, obj2) { var val1 = Number(obj1.item); var val2 = Number(obj2.item); if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } }); log.debug('midData', midData); for ( var m in midData) { newData.push(midData[m]); } } log.debug('newData', newData); return newData; } function getSoData(arr) { var soData = []; for ( var i in arr) { if (soData.indexOf(arr[i].soNumber) == -1) { soData.push(arr[i].soNumber); } } soData.sort(); log.debug('soData', soData); return soData; }<br>
最終數(shù)組截圖:
對(duì)比一開(kāi)始的數(shù)組和排序后的數(shù)組確實(shí)實(shí)現(xiàn)了按照soNumber和item兩個(gè)部分順序排列,但是也可以看到圈出來(lái)的部分的amount金額在相同的soNumber和item下并沒(méi)有順序,如果要實(shí)現(xiàn)amount部也有序呢?
三層排序
實(shí)現(xiàn)代碼:
/** * 三層排序算法 */ function multilayerSorting() { var arr = [ { "soNumber" : "52085848", "item" : "313281", "amount" : "3" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "10" }, { "soNumber" : "52085848", "item" : "313330", "amount" : "5" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "4" }, { "soNumber" : "52085843", "item" : "313338", "amount" : "13" }, { "soNumber" : "52085843", "item" : "422784", "amount" : "108" } ] // 整理soNumber成數(shù)組,并且從小到大排列 var soData = getSoData(arr); var newData = []; for ( var i in soData) { var midData = [] for ( var j in arr) { if (soData[i] == arr[j].soNumber) { midData.push(arr[j]); } } midData = midData.sort(function(obj1, obj2) { var val1 = Number(obj1.item); var val2 = Number(obj2.item); if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } }); var itemData = [] for ( var m in midData) { if (itemData.indexOf(midData[m].item) == -1) { itemData.push(midData[m].item) } } for ( var n in itemData) { var midData1 = []; for ( var x in midData) { if (midData[x].item == itemData[n]) { midData1.push(midData[x]); } } midData1 = midData1.sort(function(obj1, obj2) { var val1 = Number(obj1.amount); var val2 = Number(obj2.amount); if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } }); for ( var y in midData1) { newData.push(midData1[y]); } } } log.debug('newData', newData); return newData; } function getSoData(arr) { var soData = []; for ( var i in arr) { if (soData.indexOf(arr[i].soNumber) == -1) { soData.push(arr[i].soNumber); } } soData.sort(); log.debug('soData', soData); return soData; }
實(shí)現(xiàn)結(jié)果
從結(jié)果可以看出實(shí)現(xiàn)了依次按照soNumber ,item ,amount 從小到大排列
思考
從兩層排序到三層排序我們可以發(fā)現(xiàn)代碼原來(lái)越繁瑣,如果要實(shí)現(xiàn)四層就更加麻煩了,不知道是否有更好的辦法實(shí)現(xiàn)這種多維度,多層次的排序。
var arr = [ { "soNumber" : "52085848", "item" : "313281", "amount" : "3" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "10" }, { "soNumber" : "52085848", "item" : "313330", "amount" : "5" }, { "soNumber" : "52085846", "item" : "313321", "amount" : "4" }, { "soNumber" : "52085843", "item" : "313338", "amount" : "13" }, { "soNumber" : "52085843", "item" : "422784", "amount" : "108" } ]
總結(jié)
到此這篇關(guān)于JS中多層次排序算法的文章就介紹到這了,更多相關(guān)JS多層次排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- javascript中的Array對(duì)象(數(shù)組的合并、轉(zhuǎn)換、迭代、排序、堆棧)
- JavaScript中數(shù)組的合并以及排序?qū)崿F(xiàn)示例
- Javascript排序算法之合并排序(歸并排序)的2個(gè)例子
- JavaScript快速排序算法不同版本原理解析
- 如何利用JavaScript實(shí)現(xiàn)排序算法淺析
- JavaScript實(shí)現(xiàn)的七種排序算法總結(jié)(推薦!)
- JavaScript數(shù)組排序的六種常見(jiàn)算法總結(jié)
- JavaScript實(shí)現(xiàn)合并(歸并)排序算法示例解析
相關(guān)文章
JavaScript+html5 canvas實(shí)現(xiàn)圖片破碎重組動(dòng)畫特效
這篇文章主要介紹了JavaScript+html5 canvas實(shí)現(xiàn)破碎重組的視頻特效,感興趣的小伙伴們可以參考一下2016-02-02JS操作字符串轉(zhuǎn)數(shù)字的常見(jiàn)方法示例
這篇文章主要介紹了JS操作字符串轉(zhuǎn)數(shù)字的常見(jiàn)方法,結(jié)合實(shí)例形式分析了javascript字符串類型轉(zhuǎn)換的常用方法及相關(guān)操作技巧,需要的朋友可以參考下2019-10-10JavaScript實(shí)現(xiàn)頁(yè)面無(wú)操作倒計(jì)時(shí)退出
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)頁(yè)面無(wú)操作倒計(jì)時(shí)退出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10學(xué)習(xí)使用bootstrap3柵格系統(tǒng)
這篇文章主要教會(huì)大家學(xué)習(xí)使用bootstrap3柵格系統(tǒng),bootstrap開(kāi)發(fā)環(huán)境搭建,還介紹了柵格系統(tǒng)的類型,感興趣的小伙伴們可以參考一下2016-04-04生產(chǎn)制造追溯系統(tǒng)之再說(shuō)條碼打印
這篇文章主要介紹了生產(chǎn)制造追溯系統(tǒng)之再說(shuō)條碼打印,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06js統(tǒng)計(jì)頁(yè)面的來(lái)訪次數(shù)實(shí)現(xiàn)代碼
這篇文章主要介紹了如何使用js統(tǒng)計(jì)頁(yè)面的來(lái)訪次數(shù),需要的朋友可以參考下2014-05-05JavaScript之class繼承_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了JavaScript之class繼承,新的關(guān)鍵字class從ES6開(kāi)始正式被引入到JavaScript中。class的目的就是讓定義類更簡(jiǎn)單,有興趣的可以了解一下2017-07-07原生JS forEach()和map()遍歷的區(qū)別、兼容寫法及jQuery $.each、$.map遍歷操作
這篇文章主要介紹了原生JS forEach()和map()遍歷的區(qū)別、兼容寫法及jQuery $.each、$.map遍歷操作,結(jié)合實(shí)例形式分析了JS使用forEach()和map()以及jQuery使用$.each、$.map進(jìn)行遍歷操作相關(guān)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-02-02Taro?小程序持續(xù)集成實(shí)現(xiàn)及原理
這篇文章主要為大家介紹了Taro?小程序持續(xù)集成實(shí)現(xiàn)及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JS實(shí)現(xiàn)的冒泡排序,快速排序,插入排序算法示例
這篇文章主要介紹了JS實(shí)現(xiàn)的冒泡排序,快速排序,插入排序算法,結(jié)合實(shí)例形式分析了javascript冒泡排序,快速排序,插入排序算法的相關(guān)原理及實(shí)現(xiàn)方法,需要的朋友可以參考下2019-03-03