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 相关文章推荐
解决 firefox 不支持 document.all的方法
Mar 12 Javascript
JS获取页面窗口大小的代码解读
Dec 01 Javascript
javascipt基础内容--需要注意的细节
Apr 10 Javascript
JS实现让访问者自助选择网页文字颜色的方法
Feb 24 Javascript
Bootstrap进度条组件知识详解
May 01 Javascript
AngularJS获取json数据的方法详解
May 27 Javascript
详解vue.js 开发环境搭建最简单攻略
Jun 12 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
JS实现按钮控制计时开始和停止功能
Jul 27 Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
微信小程序实现左滑动删除效果
Mar 30 Javascript
Javascript异步流程控制之串行执行详解
Sep 27 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新手谈谈我的学习心得
2007/02/25 PHP
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
js实现的常用的左侧导航效果
2013/10/17 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python回调函数用法实例详解
2015/07/02 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
简历自我评价怎么写呢?
2014/01/06 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
职代会闭幕词
2015/01/28 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
法制工作总结2015
2015/07/23 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis