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 相关文章推荐
JS 事件绑定函数代码
Apr 28 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
javascript实现上传图片并预览的效果实现代码
Apr 11 Javascript
JQuery将文本转化成JSON对象需要注意的问题
May 09 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
Dec 05 Javascript
javascript中定义类的方法汇总
Dec 28 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
Oct 19 Javascript
Vue基于NUXT的SSR详解
Oct 24 Javascript
你应该了解的JavaScript Array.map()五种用途小结
Nov 14 Javascript
vue router 用户登陆功能的实例代码
Apr 24 Javascript
taro开发微信小程序的实践
May 21 Javascript
Vue 自定义指令实现一键 Copy功能
Sep 16 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
ThinkPHP写第一个模块应用
2012/02/20 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
js数组操作学习总结
2013/11/04 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
node错误处理与日志记录的实现
2018/12/24 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
Python装饰器使用示例及实际应用例子
2015/03/06 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python imread、newaxis用法详解
2019/11/04 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
军训 自我鉴定
2014/02/03 职场文书
科级干部考察材料
2014/02/15 职场文书
美术教学感言
2014/02/22 职场文书
协议书模板
2014/04/23 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
超市店庆活动方案
2014/08/31 职场文书
学校国庆节活动总结
2015/03/23 职场文书
科技活动总结范文
2015/05/11 职场文书
电影开国大典观后感
2015/06/04 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python