浏览代码

Gitbook Auto Published

willin 8 年之前
父节点
当前提交
6180e77809
共有 1 个文件被更改,包括 103 次插入14 次删除
  1. 103 14
      experience/advanced/desktop-app.md

+ 103 - 14
experience/advanced/desktop-app.md

@@ -163,50 +163,139 @@ if (process.env.NODE_ENV === 'development') {
 [
   {
     name: 'Default',
-    order: 1,
-    id: 'xxx',
+    order: 2,
+    id: 'default',
     type: 'item',
     enabled: true
   },
   {
     namename: 'Folder',
-    order: 2,
-    id: 'xxx',
+    order: 1,
+    id: 'xxx1',
     type: 'folder',
     children: [
       {
+        name: 'Sub Item 2',
+        order: 2,
+        id: 'xxxs2',
+        type: 'item',
+        enabled: false
+      },
+      {
         name: 'Sub Item 1',
         order: 1,
-        id: 'xxx',
+        id: 'xxxs1',
         type: 'item',
-        enabled: false
+        enabled: true
       },
       {
-        name: 'Sub Item 2',
-        order: 2,
-        id: 'xxx',
+        name: 'Sub Item 4',
+        order: 4,
+        id: 'xxxs4',
         type: 'item',
         enabled: true
       },
+      {
+        name: 'Sub Item 3',
+        order: 3,
+        id: 'xxxs3',
+        type: 'item',
+        enabled: true
+      }
     ]
   }
 ]
 ```
 
-排序算法:
+### 排序算法
 
 1. 对顶级项目进行排序
 2. 对子菜单项目进行排序
 
 ```js
-const reorder = arr => arr.sort(x => x.order).map(x => {
-  if (x.type === 'folder') {
-    x.children = x.children.sort(y => y.order);
+const reorderItems = arr => arr.sort((x, y) => x.order - y.order > 0 ? 1 : -1).map((i, iIndex) => {
+  i.order = iIndex + 1;
+  if (i.type === 'folder') {
+    i.children = i.children.sort((x, y) => x.order - y.order > 0 ? 1 : -1).map((j, jIndex) => {
+      j.order = jIndex + 1;
+      return j;
+    });
   }
-  return x;
+  return i;
 });
 ```
 
+### 删除元素算法
+
+1. 默认项禁止删除
+2. 编程过程中的异常捕获,实际操作中不会发生
+3. 子菜单超过两个项目禁止删除
+
+```js
+const deleteItem = (arr, id, pid = '') => {
+  if(id==='default') return false;
+  let index;
+  if (pid === '') {
+    index = arr.findIndex((x) => x.id === id);
+    // 异常捕获
+    if (index === -1) return false;
+    // 子菜单超过两个项目禁止删除
+    if (typeof arr[index].children === 'object' && arr[index].children.length > 1) return false;
+    arr.splice(index, 1);
+    return reorderItems(arr);
+  }
+  index = arr.findIndex((x) => x.id === pid);
+  // 异常捕获
+  if (index === -1) return false;
+  arr[index].children = deleteItem(arr[index].children, id);
+  return reorderItems(arr);
+};
+```
+
+### 添加元素算法
+
+1. 不能建立二级目录
+2. 编程过程中的异常捕获,实际操作中不会发生
+
+```js
+const uuid = require('uuid');
+const insertItem = (arr, name, pid = '', type = 'item') => {
+  if (type === 'folder' && pid !== '') return false;
+  const item = {
+    name,
+    order: -1,
+    id: uuid.v4(),
+  };
+  if (type === 'item') {
+    item.enabled = false;
+  } else {
+    item.children = [];
+  }
+  if (pid === '') {
+    item.order = arr.length;
+    arr.push(item);
+  } else {
+    const index = arr.findIndex((x) => x.id === pid);
+    // 异常捕获
+    if (index === -1) return false;
+    item.order = arr[index].length;
+    arr[index].children.push(item);
+  }
+  return reorderItems(arr);
+};
+```
+
+### 位置调整算法
+
+#### 上移
+
+#### 下移
+
+### 优化
+
+* 以 class 形式封装
+* 抛出简单的外部接口
+
 ---
 
 Hosts.js项目源码: <https://github.com/js-cool/Hosts.js>