JavaScript实现二维坐标点排序效果


Posted in Javascript onJuly 18, 2017

今天给大家分享下最近web项目中出现的一个技术难点问题——坐标排序;

如下图所示,要求在前端页面上按顺序将下面5个模块的坐标依次保存至数据库

JavaScript实现二维坐标点排序效果

现在已知信息如下:

1、每个模块分别为一个div

2、每个div可随意拖动(故拖动之后的顺序是错乱的)

3、每个div的坐标(css绝对定位获得的left、top属性值)

现在已通过程序将5个模块div的坐标信息用一个对象数组保存

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为每个模块唯一标志符(本实例用于提交数据库) 

一、排序思考 

1、排序规则如何制定?

客户及项目负责人没有具体说明规则,所以需要由技术人员按照技术方面的常规逻辑进行分析。

按照我们理解,上面5个div的正常情况下的顺序应该是:从上到下,从左到右 

2、排序算法如何实现?

根据上面得出的排序规则,我们需要分别对两点的y、x坐标分别比较,确定出排序

A、从上到下:坐标y越小,越排在前面

B、从左到右:坐标x越小,越排在前面

C、优先级为y坐标,若y坐标相等,则x坐标越小,越排在前面

二、代码实现 

1、两点比较

我们先定义两个坐标点,编写代码进行比较

var p1 = { x: 350, y: 0 };
var p2 = { x: 320, y: 0 };

console.log(SetSortRule(p1, p2));

//两个坐标比较大小
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;
   }
}

关键代码:SetSortRule(p1,p2)

p1,p2分别为需要比较的两点对象 

这样一来,我们对于两个点的排序就可以实现了,接下来就是对上面对象数组中的5个点进行排序。 

2、多点比较

我们再来观察下这5个点构成的对象数组

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个点对象两两比较,这里就得用到冒泡排序法

既然是冒泡排序,大家都应该挺熟悉的吧,这里就不再细讲,直接上代码

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为对象数组(此实例为p对象数组)
SetSortRule(arry[j],arry[j + 1]),为两个点进行比较

3、输出效果

最终输出结果如下图,这里我就用浏览器console一下了

JavaScript实现二维坐标点排序效果

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);
  }

  //两个坐标比较大小
  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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
asp 的 分词实现代码
May 24 Javascript
WordPress 插件——CoolCode使用方法与下载
Jul 02 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
JavaScript使用replace函数替换字符串的方法
Apr 06 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
原生js三级联动的简单实现代码
Jun 07 Javascript
利用JS判断鼠标移入元素的方向
Dec 11 Javascript
canvas绘制表盘时钟
Jan 23 Javascript
jquery对table做排序操作的实例演示
Aug 10 jQuery
原生JS实现轮播图效果
Oct 12 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
Nov 08 Javascript
微信小程序调用后台service教程详解
Nov 06 Javascript
Angular.js中angular-ui-router的简单实践
Jul 18 #Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 #jQuery
jquery版轮播图效果和extend扩展
Jul 18 #jQuery
Vue学习笔记进阶篇之vue-cli安装及介绍
Jul 18 #Javascript
深入解析Vue 组件命名那些事
Jul 18 #Javascript
js实现本地图片文件拖拽效果
Jul 18 #Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 #Javascript
You might like
URL Rewrite的设置方法
2007/01/02 PHP
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
javascript中new关键字详解
2015/12/14 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python 函数返回值的示例代码
2019/03/11 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
自我评价范文
2013/12/22 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
骨干教师培训制度
2014/01/13 职场文书
心理健康课教学反思
2014/02/13 职场文书
品质主管岗位职责
2014/03/16 职场文书
婚前协议书范本
2014/04/15 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
2014年招生工作总结
2014/11/26 职场文书
初中差生评语
2014/12/29 职场文书
陕西导游词
2015/02/04 职场文书
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers