JavaScript實(shí)現(xiàn)二維坐標(biāo)點(diǎn)排序效果
今天給大家分享下最近web項(xiàng)目中出現(xiàn)的一個(gè)技術(shù)難點(diǎn)問(wèn)題——坐標(biāo)排序;
如下圖所示,要求在前端頁(yè)面上按順序?qū)⑾旅?個(gè)模塊的坐標(biāo)依次保存至數(shù)據(jù)庫(kù)
現(xiàn)在已知信息如下:
1、每個(gè)模塊分別為一個(gè)div
2、每個(gè)div可隨意拖動(dòng)(故拖動(dòng)之后的順序是錯(cuò)亂的)
3、每個(gè)div的坐標(biāo)(css絕對(duì)定位獲得的left、top屬性值)
現(xiàn)在已通過(guò)程序?qū)?個(gè)模塊div的坐標(biāo)信息用一個(gè)對(duì)象數(shù)組保存
var p = [ { id: 184, x: 0, y: 0 }, { id: 185, x: 320, y: 0 }, { id: 186, x: 30, y: 60 }, { id: 187, x: 150, y: 120 }, { id: 188, x: 130, y: 80 }, { id: 189, x: 100, y: 80 } ]
注:id為每個(gè)模塊唯一標(biāo)志符(本實(shí)例用于提交數(shù)據(jù)庫(kù))
一、排序思考
1、排序規(guī)則如何制定?
客戶及項(xiàng)目負(fù)責(zé)人沒(méi)有具體說(shuō)明規(guī)則,所以需要由技術(shù)人員按照技術(shù)方面的常規(guī)邏輯進(jìn)行分析。
按照我們理解,上面5個(gè)div的正常情況下的順序應(yīng)該是:從上到下,從左到右
2、排序算法如何實(shí)現(xiàn)?
根據(jù)上面得出的排序規(guī)則,我們需要分別對(duì)兩點(diǎn)的y、x坐標(biāo)分別比較,確定出排序
A、從上到下:坐標(biāo)y越小,越排在前面
B、從左到右:坐標(biāo)x越小,越排在前面
C、優(yōu)先級(jí)為y坐標(biāo),若y坐標(biāo)相等,則x坐標(biāo)越小,越排在前面
二、代碼實(shí)現(xiàn)
1、兩點(diǎn)比較
我們先定義兩個(gè)坐標(biāo)點(diǎn),編寫(xiě)代碼進(jìn)行比較
var p1 = { x: 350, y: 0 }; var p2 = { x: 320, y: 0 }; console.log(SetSortRule(p1, p2)); //兩個(gè)坐標(biāo)比較大小 function SetSortRule(p1, p2) { if (p1.y > p2.y) { return true; } else if (p1.y == p2.y) { return (p1.x > p2.x); } else { return false; } }
關(guān)鍵代碼:SetSortRule(p1,p2)
p1,p2分別為需要比較的兩點(diǎn)對(duì)象
這樣一來(lái),我們對(duì)于兩個(gè)點(diǎn)的排序就可以實(shí)現(xiàn)了,接下來(lái)就是對(duì)上面對(duì)象數(shù)組中的5個(gè)點(diǎn)進(jìn)行排序。
2、多點(diǎn)比較
我們?cè)賮?lái)觀察下這5個(gè)點(diǎn)構(gòu)成的對(duì)象數(shù)組
var p = [ { id: 184, x: 0, y: 0 }, { id: 185, x: 320, y: 0 }, { id: 186, x: 30, y: 60 }, { id: 187, x: 150, y: 120 }, { id: 188, x: 130, y: 80 }, { id: 189, x: 100, y: 80 } ]
5個(gè)點(diǎn)對(duì)象兩兩比較,這里就得用到冒泡排序法
既然是冒泡排序,大家都應(yīng)該挺熟悉的吧,這里就不再細(xì)講,直接上代碼
function SetSortPoint(arry) { var len = arry.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (SetSortRule(arry[j],arry[j + 1])) { var tmp = arry[j]; arry[j] = arry[j + 1]; arry[j + 1] = tmp; } } } console.log(arry); }
arry為對(duì)象數(shù)組(此實(shí)例為p對(duì)象數(shù)組)
SetSortRule(arry[j],arry[j + 1]),為兩個(gè)點(diǎn)進(jìn)行比較
3、輸出效果
最終輸出結(jié)果如下圖,這里我就用瀏覽器console一下了
4、完整代碼如下
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <script type="text/javascript"> var p = [ { id: 184, x: 0, y: 0 }, { id: 185, x: 320, y: 0 }, { id: 186, x: 30, y: 60 }, { id: 187, x: 150, y: 120 }, { id: 188, x: 130, y: 80 }, { id: 189, x: 100, y: 80 } ] SetSortPoint(p); function SetSortPoint(arry) { var len = arry.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (SetSortRule(arry[j], arry[j + 1])) { var tmp = arry[j]; arry[j] = arry[j + 1]; arry[j + 1] = tmp; } } } console.log(arry); } //兩個(gè)坐標(biāo)比較大小 function SetSortRule(p1, p2) { if (p1.y > p2.y) { return true; } else if (p1.y == p2.y) { return (p1.x > p2.x); } else { return false; } } </script> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js與jquery中獲取當(dāng)前鼠標(biāo)的x、y坐標(biāo)位置的代碼
- js 獲取坐標(biāo) 通過(guò)JS得到當(dāng)前焦點(diǎn)(鼠標(biāo))的坐標(biāo)屬性
- 基于JavaScript實(shí)現(xiàn) 獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的方法
- JavaScript獲取鼠標(biāo)坐標(biāo)的函數(shù)(兼容IE、FireFox、Chrome)
- js獲得鼠標(biāo)的坐標(biāo)值的方法
- 通過(guò)百度地圖獲取公交線路的站點(diǎn)坐標(biāo)的js代碼
- javascript 事件對(duì)象 坐標(biāo)事件說(shuō)明
- js Event對(duì)象的5種坐標(biāo)
- 通過(guò)JS 獲取Mouse Position(鼠標(biāo)坐標(biāo))的代碼
- JavaScript獲取鼠標(biāo)移動(dòng)時(shí)的坐標(biāo)(兼容IE8、chome谷歌、Firefox)
相關(guān)文章
javascript使用smipleChart實(shí)現(xiàn)簡(jiǎn)單圖表
這篇文章主要介紹了javascript使用smipleChart實(shí)現(xiàn)簡(jiǎn)單圖表的方法及示例分享,需要的朋友可以參考下2015-01-01JavaScript輪播停留效果的實(shí)現(xiàn)思路
輪播停留與無(wú)線滾動(dòng)十分類似,都是利用屬性及變量控制移動(dòng)實(shí)現(xiàn)輪播。下面通過(guò)本文給大家分享JavaScript輪播停留效果的實(shí)現(xiàn)思路,感興趣的朋友一起看看吧2018-05-05實(shí)現(xiàn)js保留小數(shù)點(diǎn)后N位的代碼
最近在做項(xiàng)目的時(shí)候,遇到要保留小數(shù)點(diǎn)后N位的問(wèn)題,經(jīng)過(guò)一番思索,最終完成了,這里記錄一下,下次需要直接就能拉出來(lái)用了2014-11-11僅一個(gè)form表單 js實(shí)現(xiàn)注冊(cè)信息依次填寫(xiě)提交功能
這篇文章主要為大家詳細(xì)介紹了僅一個(gè)form表單,JavaScript可實(shí)現(xiàn)注冊(cè)信息依次填寫(xiě)提交功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06javascript 異步頁(yè)面查詢實(shí)現(xiàn)代碼(asp.net)
異步頁(yè)面查詢,其實(shí)與自動(dòng)完成時(shí)一樣的原理,根據(jù)用戶輸入的關(guān)鍵詞自動(dòng)的與數(shù)據(jù)庫(kù)中的匹配,并顯示出來(lái),提高用戶體驗(yàn),但主要搜索量大的話,增加服務(wù)器開(kāi)銷。2010-05-05如何基于javascript實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要介紹了如何基于javascript實(shí)現(xiàn)貪吃蛇游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02bootstrap表格內(nèi)容過(guò)長(zhǎng)時(shí)用省略號(hào)表示的解決方法
這篇文章主要介紹了bootstrap表格內(nèi)容過(guò)長(zhǎng)時(shí)用省略號(hào)表示的解決方法,需要的朋友可以參考下2017-11-11BootStrap的alert提示框的關(guān)閉后再顯示怎么解決
這篇文章主要介紹了BootStrap的alert提示框的關(guān)閉后再顯示問(wèn)題的相關(guān)資料,需要的朋友可以參考下2016-05-05JS模擬自動(dòng)點(diǎn)擊的簡(jiǎn)單實(shí)例
這篇文章介紹了JS模擬自動(dòng)點(diǎn)擊的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-08-08