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 相关文章推荐
谈谈关于JavaScript 中的 MVC 模式
Apr 11 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
Jun 24 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
Aug 11 Javascript
Vue.js 表单校验插件
Aug 14 Javascript
Angular页面间切换及传值的4种方法
Nov 04 Javascript
Javascript数组循环遍历之forEach详解
Nov 07 Javascript
详解springmvc 接收json对象的两种方式
Dec 06 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
Vue2 添加数据可视化支持的方法步骤
Jan 02 Javascript
vue-router的两种模式的区别
May 30 Javascript
在vue项目中封装echarts的步骤
Dec 25 Vue.js
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
德生9700DX电路分析
2021/03/02 无线电
php中对2个数组相加的函数
2011/06/24 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
pandas实现选取特定索引的行
2018/04/20 Python
在python里面运用多继承方法详解
2019/07/01 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
Jupyter加载文件的实现方法
2020/04/14 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
护理工作感言
2014/01/16 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
小学四年级作文之写景
2019/08/23 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis