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 相关文章推荐
php图像生成函数之间的区别分析
Dec 06 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
Nov 17 Javascript
在HTML代码中使用JavaScript代码的例子
Oct 16 Javascript
基于replaceChild制作简单的吞噬特效
Sep 21 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
vue webuploader 文件上传组件开发
Sep 23 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
layui的table单击行勾选checkbox功能方法
Aug 14 Javascript
在vue中多次调用同一个定义全局变量的实例
Sep 25 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
Wordpress php 分页代码
2009/10/21 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
Python实现从百度API获取天气的方法
2015/03/11 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python 将pdf转成图片的方法
2018/04/23 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
python绘制彩虹图
2019/12/16 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
工作室成员个人发展规划范文
2014/01/24 职场文书
优秀教师获奖感言
2014/01/31 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
儿园租房协议书范本
2014/12/02 职场文书
道歉信怎么写
2015/05/12 职场文书