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 EXCEL 操作类代码
Jul 30 Javascript
JS 表单验证大全
Nov 23 Javascript
JavaScript打字小游戏代码
Dec 26 Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
Jan 24 Javascript
js获取当前日期时间及其它操作汇总
Apr 17 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
JavaScript设置名字输入不合法的实现方法
May 23 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
浅谈vue的踩坑路
Aug 31 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
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
对联广告js flash激活
2006/10/19 Javascript
简明json介绍
2008/09/28 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
python编程开发之类型转换convert实例分析
2015/11/13 Python
浅谈python中set使用
2016/06/30 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
python多线程使用方法实例详解
2019/12/30 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
打架检讨书400字
2014/01/17 职场文书
司法局火灾防控方案
2014/06/05 职场文书
小学教师见习总结
2015/06/23 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书