UNPKG

9.09 kBJavaScriptView Raw
1var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
2
3// 兼容ES7的includes
4if (!window.Array.prototype.includes) {
5 window.Array.prototype.includes = function (searchElement) {
6 return this.some(function (el) {
7 return el === searchElement;
8 });
9 };
10}
11
12// 幂集 如:[1,2],返回[[1],[2],[1,2]]
13window.Array.prototype.powerset = function () {
14 var ps = [[]];
15 for (var i = 0; i < this.length; i++) {
16 for (var j = 0, len = ps.length; j < len; j++) {
17 ps.push(ps[j].concat(this[i]));
18 }
19 }
20 return ps;
21};
22
23// 二维数组转为一维数组
24window.Array.prototype.toOneColumn = function () {
25 var reg = /[\d\.]+\,([\d\.]+)/g; // eslint-disable-line
26 return this.join(',').replace(reg, '$1').split(',');
27};
28
29// 包含,支持传数组包含数组
30window.Array.prototype.contains = function (arg) {
31 if (toString.call(arg) !== '[object Array]') {
32 return this.indexOf(arg) > -1;
33 }
34 return this.filter(function (elem) {
35 return arg.indexOf(elem) > -1;
36 }).length === arg.length;
37};
38
39// 比较两个数组是否相同, 比较不了包含{x: 20}的数组
40if (window.Array.prototype.equals) {
41 console.warn('覆盖现有的window.Array.prototype.equals。 可能的原因:新的API定义了方法,存在框架冲突,或者在代码中包含了双重包含。');
42}
43window.Array.prototype.equals = function (array) {
44 if (!array) return false;
45
46 // 比较长度可以节省很多时间
47 if (this.length !== array.length) return false;
48
49 for (var i = 0; i < this.length; i++) {
50 // 检查是否有嵌套的数组
51 if (this[i] instanceof Array && array[i] instanceof Array) {
52 // 递归到嵌套数组中
53 if (!this[i].equals(array[i])) return false;
54 }
55 // 检查是否有JSON数据,只比较一层
56 else if (this[i] instanceof Object && array[i] instanceof Object) {
57 for (var n in this[i]) {
58 if (this[i][n] !== array[i][n]) return false;
59 }
60 } else if (this[i] !== array[i]) {
61 // 警告 - 两个不同的对象实例永远不会相同:{x:20}!= {x:20}
62 return false;
63 }
64 }
65 return true;
66};
67// 从for-in循环隐藏方法
68Object.defineProperty(window.Array.prototype, "equals", { enumerable: false });
69
70// 判断数组中是否有重复数据,只能比较数字字符串
71window.Array.prototype.isRepeatArray = function () {
72 var arrStr = this.join(',') + ',';
73 for (var _iterator = this, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
74 var _ref;
75
76 if (_isArray) {
77 if (_i >= _iterator.length) break;
78 _ref = _iterator[_i++];
79 } else {
80 _i = _iterator.next();
81 if (_i.done) break;
82 _ref = _i.value;
83 }
84
85 var item = _ref;
86
87 if (arrStr.replace(item + ',', '').indexOf(item + ',') >= 0) return true;
88 }
89 return false;
90};
91// 移除数组json中的项
92window.Array.prototype.removeProperties = function (properties) {
93 for (var _iterator2 = this, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
94 var _ref2;
95
96 if (_isArray2) {
97 if (_i2 >= _iterator2.length) break;
98 _ref2 = _iterator2[_i2++];
99 } else {
100 _i2 = _iterator2.next();
101 if (_i2.done) break;
102 _ref2 = _i2.value;
103 }
104
105 var item = _ref2;
106
107 for (var n in item) {
108 for (var _iterator3 = properties, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
109 var _ref3;
110
111 if (_isArray3) {
112 if (_i3 >= _iterator3.length) break;
113 _ref3 = _iterator3[_i3++];
114 } else {
115 _i3 = _iterator3.next();
116 if (_i3.done) break;
117 _ref3 = _i3.value;
118 }
119
120 var property = _ref3;
121
122 if (n === property) delete item[n];
123 }
124 }
125 }
126 return this;
127};
128// 将数组中的项都转成字符串
129window.Array.prototype.toStringOption = function () {
130 return this.map(function (item) {
131 if ((typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object' || typeof item === 'function') return JSON.stringify(item);
132 return item;
133 });
134};
135
136/* -----------------------------------------------------
137 树数据扁平化, 将树的children拉平
138 @格式 [{id: '', name: '', children: {}}]
139 @return [{id: '', name: '', parentid: ''}, {id: '', name: '', parentid: ''}]
140 ----------------------------------------------------- */
141window.Array.prototype.flattenTree = function () {
142 var list = this;
143 if (!Array.isArray(list) || !list.length) return list;
144 return _buildTreeToFlatten(list);
145};
146function _buildTreeToFlatten(list) {
147 // 扁平化, 将children拉平
148 var tree = [];
149 var temp = []; // 用于存储children
150 // 先将第一层节点放入temp
151 for (var i = 0; i < list.length; i++) {
152 temp.push(list[i]);
153 }
154 while (temp.length) {
155 // 取出一项, 并移除此项
156 var item = temp.shift();
157 // 此项children合并到temp
158 if (item.children && item.children.length) {
159 // 添加parentid
160 for (var c = 0; c < item.children.length; c++) {
161 item.children[c].parentid = item.id;
162 }
163 temp = item.children.concat(temp);
164 }
165 // 删除此项children
166 delete item.children;
167 // 添加此项到tree
168 tree.push(item);
169 }
170 return tree;
171}
172
173// 取出无父节点的顶层数据, 即[{id: '', name: '', parentid: '-1' 或没有parentid}]
174window.Array.prototype.getFlattenTreeRoots = function () {
175 var list = this;
176 var roots = [];
177 var objList = {};
178 // 转成键值对数据
179 list.forEach(function (item) {
180 objList[item.id] = item;
181 });
182 // 取出顶层数据
183 list.forEach(function (item) {
184 if (!objList[item.parentid]) roots.push(item);
185 });
186 return roots;
187};
188
189// 根据id, 取出此id的下级节点数据, 即[{id: '', name: '', parentid: ''}]
190window.Array.prototype.getFlattenTreeChildren = function (id) {
191 var list = this;
192 var children = [];
193 for (var i = 0, child; child = list[i++];) {
194 // eslint-disable-line
195 if (id && child.parentid === id.toString()) {
196 children.push(child);
197 }
198 }
199 return children;
200};
201
202// 根据id, 取出此id的后代节点数据, 即[{id: '', name: '', parentid: ''}]
203window.Array.prototype.getFlattenTreeDescendants = function (id) {
204 var list = this;
205 var descendants = [];
206 function buildChildren(list, id) {
207 for (var i = 0, item; item = list[i++];) {
208 // eslint-disable-line
209 if (id && item.parentid === id.toString()) {
210 descendants.push(item);
211 buildChildren(list, item.id);
212 }
213 }
214 }
215 buildChildren(list, id);
216 return descendants;
217};
218
219// 根据id, 取出此id节点的数据, 即{id: '', name: '', parentid: ''}
220window.Array.prototype.getFlattenTreeNode = function (id) {
221 var list = this;
222 var item = list.filter(function (option) {
223 if (option.id === id) return true;
224 return false;
225 });
226 if (item && item.length > 0) {
227 item = item[0];
228 }
229 return item;
230};
231
232/* -----------------------------------------------------
233 树数据深度化, 将树的parentid深度为children, 必须有id和parentid
234 @格式 [{id: '', name: '', parentid: ''}, {id: '', name: '', parentid: ''}]
235 @return [{id: '', name: '', children: {}}]
236 ----------------------------------------------------- */
237window.Array.prototype.deepTree = function () {
238 var list = this;
239 if (!Array.isArray(list) || !list.length) return list;
240 if (!list[0].hasOwnProperty('parentid')) return list;
241
242 // 深度化, 修改trees
243 function _buildTreeToDeep(item) {
244 var children = list.getFlattenTreeChildren(item.id);
245 if (children && children.length) {
246 if (item.children) {
247 item.children.push(children);
248 } else {
249 item.children = children;
250 }
251 for (var i = 0, child; child = children[i++];) {
252 // eslint-disable-line
253 _buildTreeToDeep(child);
254 }
255 }
256 }
257 var trees = list.getFlattenTreeRoots();
258 for (var i = 0, tree; tree = trees[i++];) {
259 // eslint-disable-line
260 _buildTreeToDeep(tree);
261 }
262 return trees;
263};
264
265// 根据id, 取出此id节点的数据, 即{id: '', name: '', parentid: ''}
266window.Array.prototype.getDeepTreeNode = function (id) {
267 var list = Object.clone(this);
268 var temp = []; // 用于存储children
269 // 先将第一层节点放入temp
270 for (var i = 0; i < list.length; i++) {
271 temp.push(list[i]);
272 }
273 while (temp.length) {
274 // 取出一项, 并移除此项
275 var item = temp.shift();
276 if (item.id === id) return item;
277 // 此项children合并到temp
278 if (item.children && item.children.length) {
279 // 添加parentid
280 for (var c = 0; c < item.children.length; c++) {
281 item.children[c].parentid = item.id;
282 }
283 temp = item.children.concat(temp);
284 }
285 // 删除此项children
286 delete item.children;
287 }
288 return {};
289};
\No newline at end of file