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 相关文章推荐
jQuery选择没有colspan属性的td的代码
Jul 06 Javascript
为jQuery增加join方法的实现代码
Nov 28 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
Aug 24 Javascript
JS功能代码集锦
May 04 Javascript
JavaScript必知必会(三) String .的方法来自何方
Jun 08 Javascript
基于bootstrap实现收缩导航条
Mar 17 Javascript
jquery ajax异步提交表单数据的方法
Oct 27 jQuery
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
vue使用laydate时间插件的方法
Nov 14 Javascript
vuex存取值和映射函数使用说明
Jul 24 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 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
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
json跨域调用python的方法详解
2017/01/11 Python
Python分析学校四六级过关情况
2017/11/22 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
python 同时读取多个文件的例子
2019/07/16 Python
基于django传递数据到后端的例子
2019/08/16 Python
Python序列类型的打包和解包实例
2019/12/21 Python
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
.NET方向面试题
2014/11/20 面试题
客服部工作职责范本
2014/02/14 职场文书
运动会广播稿20字
2014/02/18 职场文书
行政人事岗位职责
2014/03/17 职场文书
答谢会策划方案
2014/05/12 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL