1.4中类型(grid_type)的卡片:1:大方块;2:竖长块;3:横长块;4:小方块

var order = 0;

// 创建链表
function List(head) {
this.head = new Node(head);
this.insert = insert;
this.find = find;
this.getNeed = getNeed;
this.position = position;
this.node = 0;
} // 创建节点
function Node(data) {
this.pre = null;
this.next = null;
this.type = data.grid_type;
this.need = [];
this.data = data;
this.arr = [[data]];
this.size = data.grid_type === 3 ? 2 : data.grid_type;
this.top = 0;
this.left = 0;
this.index = order;
} // 查找节点
function find(data, cur) {
while (!cur.need.includes(data.grid_type)) {
if (cur.next === null) {
return this.insert(cur, data);
} else {
cur = cur.next;
}
}
// 将数据添加到arr后,清空need对应得grid_type
// 如果前两个盒子是type1,那么第三个盒子不能是type2(竖方块)
if (
cur.data.grid_type === 1 &&
cur.arr[1] &&
cur.arr[1][0].grid_type === 1 &&
data.grid_type === 2
) {
if (cur.next === null) {
return this.insert(cur, data);
} else {
this.find(data, cur.next);
}
}
// 如果前一个盒子是type1,那么第二个盒子不能是type3(横方块)
if (cur.data.grid_type === 1 && data.grid_type === 3) {
if (cur.next === null) {
return this.insert(cur, data);
} else {
this.find(data, cur.next);
}
}
let size = cur.size;
let num = data.grid_type === 3 ? 2 : data.grid_type;
let total = size + num;
if (total <= 4) {
let len = cur.arr.length;
cur.arr[len] = [];
cur.arr[len][0] = data; cur.size += num;
let index = cur.need.indexOf(data.grid_type);
if (total === 4) {
cur.need = [];
} else {
cur.need.splice(index, 1);
}
} else {
return this.insert(cur, data);
}
} // 插入节点
function insert(cur, data) {
let newOne = new Node(data);
newOne.next = cur.next;
newOne.pre = cur;
cur.next = newOne;
newOne.need = this.getNeed(data);
this.node++;
newOne.index = this.node;
} // 需要得盒子
function getNeed(data) {
let type = data.grid_type;
if (type === 1) {
return [1, 1, 1, 3];
} else if (type === 2) {
return [1, 1, 2];
} else if (type === 3) {
return [1, 1, 3];
} else {
return [];
}
} // 位置信息
//half总数据得一半
function position(half) {
let cur = this.head;
let top = 0;
let box = [];
while (cur.next !== null) {
if (cur.index < half) {
p(cur.arr, cur.index, top);
box.push(cur.arr);
cur = cur.next;
} else {
top = 388;
let index = cur.index - half; //剩下得部分
p(cur.arr, index, top);
box.push(cur.arr);
cur = cur.next;
}
}
return box;
} /*
arr[[{data},{position}],[]]
*/
function p(arr, index, baseTop) {
let len = arr.length;
let base = index * 388;
arr.map(function(item, i) {
arr[i][1] = {};
arr[i][1].top = baseTop;
});
arr[0][1].left = base;
if (len === 4) {
arr[1][1].left = base + 194;
arr[2][1].left = base;
arr[2][1].top = baseTop + 194;
arr[3][1].top = baseTop + 194;
arr[3][1].left = base + 194;
} else if (len === 2) {
let flag = "";
arr.map(function(item, i) {
if (item[0].grid_type === 2) {
flag = "v";
} else if (item[0].grid_type === 3) {
flag = "h";
} else {
flag = "s";
}
});
if (flag == "s" || flag == "v") {
arr[1][1].left = base + 174;
} else if (flag === "h") {
arr[1][1].top = baseTop + 194;
arr[1][1].left = base;
}
} else if (len === 3) {
if (arr[0][0].grid_type === 1) {
if (arr[1][0].grid_type === 1) {
arr[1][1].left = base + 194;
arr[2][1].left = base;
arr[2][1].top = baseTop + 194;
} else {
arr[1][1].left = base;
arr[2][1].left = base;
arr[2][1].top = baseTop + 194;
}
} else if (arr[0][0].grid_type === 2) {
arr[1][1].left = index * 388 + 194;
arr[2][1].left = index * 388 + 194;
arr[2][1].top = baseTop + 194;
} else if (arr[0][0].grid_type === 3) {
arr[1][1].left = index * 388;
arr[1][1].top = baseTop + 194;
arr[2][1].left = index * 388 + 194;
arr[2][1].top = baseTop + 194;
}
}
} function list(data) {
let newList = new List(data[0]);
newList.head.need = newList.getNeed(newList.head.data);
for (var i = 1; i < data.length; i++) {
newList.find(data[i], newList.head);
}
let half = Math.ceil(newList.node / 2);
newList.position(half);
let finalData = allArr(newList.head); return finalData;
} function allArr(head) {
let finalData = [];
let cur = head;
while (cur.next !== null) {
finalData.push(cur.arr);
cur = cur.next;
}
return finalData;
} export default list;

双向链表--首页大小不一卡片排序 --- react --- js的更多相关文章

  1. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  2. react.js 你应知道的9件事

    React.js 初学者应该知道的 9 件事   本文假定你已经有了一下基本的概念.如果你不熟悉 component.props 或者 state 这些名词,你最好先去阅读下官方起步和手册.下面的代码 ...

  3. React.js学习

    React.js学习之环境搭建 1 工欲善其事必先利其器:前端开发工具 1.1 WebStorm和Sublime Text Sublime Text:作为代码编辑器,Sublime Text的优点如下 ...

  4. php文件管理,能够点击依照时间,大小,名称排序

    php文件管理.能够点击依照时间.大小,名称排序  本例没实用到jquery 演示   PHP Code <?php    $rootdir="./";    $spacen ...

  5. React JS和React-Native学习指南

    自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南本指南汇集React- ...

  6. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了

    原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...

  7. React.js 小书 Lesson22 - props.children 和容器类组件

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson22 转载请注明出处,保留原文链接和作者信息. 有一类组件,充当了容器的作用,它定义了一种外层 ...

  8. React.js基础知识

    一. react.js的基本使用方法 (1)快速使用,hello world <div id="app"></div> <script src=&qu ...

  9. Web框架概述——React.js

    目前,在前端Web开发中,三大热门框架为React.js,Vue.js,Angular.js .当然,三大框架各有各的优缺点,这里就不多说了,下面我就针对前段时间所学的React框架做一下整体知识点的 ...

随机推荐

  1. npm升级package.json依赖包到最新版本号

    转载自:https://blog.csdn.net/syaivin/article/details/79388244?utm_source=blogxgwz1 1.安装: npm install -g ...

  2. bat 命令 常用配置及其用法

    1.初衷: bat 批处理文件:当我懒得一个个操作的时候,可以把若干东西放到一个文件里面,开机运行或者需要的时候手动运行.节省时间. 2.命令集说明 2.1 常用命令 2.1.0 help 命令 /? ...

  3. 简单实现Java的RMI——远程方法调用

    一.RMI简介: 说到RMI就不得不说RPC了. RPC:(Remote Procedure Call),远程过程调用. RMI(Remote Method Invocation),远程方法调用. R ...

  4. Java中 Tomcat 是干什么的?

    Tomcat是web容器.它的作用稍后给你解释. 你在做web项目时,多数需要http协议,也就是基于请求和响应,比如你在百度输入一行内容搜索, 那么百度服务器如何处理这个请求呢,他需要创建servl ...

  5. 数据结构(C语言版)-第6章 图

    6.1 图的定义和基本术语 图:Graph=(V,E)  V:顶点(数据元素)的有穷非空集合:  E:边的有穷集合. 无向图:每条边都是无方向的 有向图:每条边都是有方向的 完全图:任意两个点都有一条 ...

  6. Getting started with Processing 示例11-9 追随鼠标移动

    程序片段 int num = 60; int[] x = new int[num]; int[] y = new int[num]; void setup(){ size(240,120); noSt ...

  7. 【转】 H.264编码原理以及I帧B帧P帧

    转自:http://www.cnblogs.com/herenzhiming/articles/5106178.html 前言 ----------------------- H264是新一代的编码标 ...

  8. English trip V1 - B 17. Giving Information 提供信息 Teacher:Taylor Key: Person Information

    In this lesson you will learn to say your phone number and address.  这节课讲学习说你的手机号码和地址. 课上内容(Lesson) ...

  9. 第一章 Lab

    关于Lab 教材恶意代码分析实战 课后练习恶意代码样本https://practicalmalwareanalysis.com或https://nostarch.com/malware.htm 以下是 ...

  10. 1.1 从UNIX到Linux的发展历程

    MIT的CTSS:第一个分时操作系统 ◼ Multics系统(Multiplexed Information and Computing System) ⚫ 1965年AT&T,MIT和GE的 ...