常用的關於數組數據的處理方法


  1  //1.js連接兩個數組
  2     var ArrayConcat = function ArrayConcat(arr) {
  3         var _ref;
  4         for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  5             args[_key - 1] = arguments[_key];
  6         }
  7 
  8         return (_ref = []).concat.apply(_ref, [arr].concat(args));
  9     };
 10     //    console.log(ArrayConcat([1,4,7], [1, 2, 3, [4]],[8,9,[0]]));//[1,4,7,1,2,3,[4],8,9,[0]]
 11     //    console.log([1,4,7].concat([1,2,3,[4]],[8,9,[0]])); //[1,4,7,1,2,3,[4],8,9,[0]]
 12 
 13 
 14     //2.從b創建一個Set,然后在a上使用Array.filter()僅保留b中不包含的值。
 15     var difference = function difference(a, b) {
 16         var s = new Set(b);
 17         return a.filter(function (x) {
 18             return !s.has(x);
 19         });
 20     };
 21     //    console.log(difference([1, 2, 3], [1, 2])); //[3]
 22     function kk(age) {
 23         return age >= 3;
 24     }
 25     //    console.log([1,2,3].filter(kk)); //[3]
 26 
 27     //3.使用slice()來偏移數組/字符串和indexOf()以檢查是否包含該值。 省略最后一個參數fromIndex,檢查整個數組/字符串。
 28     var includes = function includes(collection, val) {
 29         var fromIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
 30         return collection.slice(fromIndex).indexOf(val) != -1;
 31     };
 32     //    console.log(includes("i-love-China","China")); //true
 33     //    console.log(includes("[1,2,3,4]","[")); //true
 34 
 35 
 36     //4.從b創建一個Set,然后在a上使用Array.filter()僅保留b中包含的值。
 37     var intersection = function intersection(a, b) {
 38         var s = new Set(b);
 39         return a.filter(function (x) {
 40             return s.has(x);
 41         });
 42     };
 43     //console.log(intersection([1,2,3,4],[3,4,5,6])); //[3,4]
 44 
 45     //5.使用Array.filter()查找返回truthy值的數組元素和使用Array.splice()刪除元素的Array.reduce()。 使用三個參數(value,index,array)調用func。
 46     var remove = function remove(arr, func) {
 47         return Array.isArray(arr) ? arr.filter(func).reduce(function (acc, val) {
 48                 arr.splice(arr.indexOf(val), 1);
 49                 return acc.concat(val);
 50             }, []) : [];
 51     };
 52     function cc(n) {
 53         return n % 2 == 0;
 54     }
 55     //    console.log(remove([2,3,4,5,6],cc));//[2,4,6]
 56 
 57     //6.使用Math.random()生成一個隨機數,將其與長度相乘,並使用Math.floor()將其四舍五入到最接近的整數。 此方法也適用於字符串。
 58     var sample = function sample(arr) {
 59         return arr[Math.floor(Math.random() * arr.length)];
 60     };
 61     // console.log(sample([23,45,67,6,78]));//78
 62 
 63     //7.使用a和b的所有值創建一個Set並轉換為數組。
 64     //es6
 65     //const union = (a, b) => Array.from(new Set([...a, ...b]));
 66     function _toConsumableArray(arr) {
 67         return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
 68     }
 69 
 70     function _nonIterableSpread() {
 71         throw new TypeError("Invalid attempt to spread non-iterable instance");
 72     }
 73 
 74     function _iterableToArray(iter) {
 75         if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
 76     }
 77 
 78     function _arrayWithoutHoles(arr) {
 79         if (Array.isArray(arr)) {
 80             for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
 81                 arr2[i] = arr[i];
 82             }
 83             return arr2;
 84         }
 85     }
 86 
 87     var union = function union(a, b) {
 88         return Array.from(new Set([].concat(_toConsumableArray(a), _toConsumableArray(b))));
 89     };
 90 
 91     //   console.log(union([1,2,3,4,5],[3,4,5,6,8])); //[1,2,3,4,5,6,8]
 92 
 93     //8.使用Array.filter()創建一個排除所有給定值的數組。
 94     //es6
 95     //const without = (arr, ...args) => arr.filter(v => args.indexOf(v) === -1);
 96     var without = function without(arr) {
 97         for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
 98             args[_key - 1] = arguments[_key];
 99         }
100 
101         return arr.filter(function (v) {
102             return args.indexOf(v) === -1;
103         });
104     };
105     //console.log(without([2,2,3,5,7],2,5)); //[3,7]
106 
107     //9.使用Math.max.apply()獲取參數中最長的數組。 創建一個長度為返回值的數組,並使用帶有map-function的Array.from()創建一個分組元素數組。 如果參數數組的長度不同,則在未找到值的情況下使用undefined。
108     var zip = function zip() {
109         for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) {
110             arrays[_key] = arguments[_key];
111         }
112 
113         var maxLength = Math.max.apply(null, arrays.map(function (a) {
114             return a.length;
115         }));
116         return Array.from({
117             length: maxLength
118         }).map(function (_, i) {
119             return Array.from({
120                 length: arrays.length
121             }, function (_, k) {
122                 return arrays[k][i];
123             });
124         });
125     };
126     //console.log(zip(['a','b','c'],[0,1,2],[true,false])); //[['a','0',true],['b',1,false],['c',2,undefined]]
127 
128     //10.使用Array.reduce()將每個值添加到累加器,使用值0初始化,除以數組的長度。
129     var average = function average(arr) {
130         return arr.reduce(function (acc, val) {
131                 return acc + val;
132             }, 0) / arr.length;
133     };
134     //console.log(average([4,5,6,7,8,9]));  //6.5
135 
136     //11.使用Array.from()創建一個新數組,該數組符合將生成的塊數。 使用Array.slice()將新數組的每個元素映射到一個大小的塊。 如果原始數組無法均勻分割,則最終的塊將包含其余元素。
137     var chunk = function chunk(arr, size) {
138         return Array.from({
139             length: Math.ceil(arr.length / size)
140         }, function (v, i) {
141             return arr.slice(i * size, i * size + size);
142         });
143     };
144     //console.log(chunk([1,2,3,4,5,6,7,8],3)); //[[1,2,3],[4,5,6],[7,8]];
145 
146     //12.使用Array.filter()過濾掉falsey值(false,null,0,“”,undefined和NaN)。
147     var compact = function compact(arr) {
148         return arr.filter(function (v) {
149             return v;
150         });
151     };
152     //console.log(compact([0,1,false,3,'23',NaN,'lla',45])); //[1, 3, "23", "lla", 45]
153 
154     //13.每次遇到數組內的特定值時,使用Array.reduce()遞增計數器。
155     var countOccurrences = function countOccurrences(arr, value) {
156         return arr.reduce(function (a, v) {
157             return v === value ? a + 1 : a + 0;
158         }, 0);
159     };
160     //console.log(countOccurrences([2,4,5,2,5,2,4,8],2)); //3
161 
162     //14.使用遞歸。 將Array.concat()與空數組([])和擴展運算符(...)一起使用以展平數組。 遞歸地展平作為數組的每個元素。
163     //ES6
164     //const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v));
165     function _toConsumableArray(arr) {
166         return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
167     }
168 
169     function _nonIterableSpread() {
170         throw new TypeError("Invalid attempt to spread non-iterable instance");
171     }
172 
173     function _iterableToArray(iter) {
174         if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
175     }
176 
177     function _arrayWithoutHoles(arr) {
178         if (Array.isArray(arr)) {
179             for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
180                 arr2[i] = arr[i];
181             }
182             return arr2;
183         }
184     }
185 
186     var deepFlatten = function deepFlatten(arr) {
187         var _ref;
188 
189         return (_ref = []).concat.apply(_ref, _toConsumableArray(arr.map(function (v) {
190             return Array.isArray(v) ? deepFlatten(v) : v;
191         })));
192     };
193     // console.log(deepFlatten([1,[2],[[3],4],5])); //[1, 2, 3, 4, 5]
194 
195     //15.循環遍歷數組,使用Array.shift()刪除數組的第一個元素,直到函數返回的值為true。 返回剩余的元素。
196     var dropElements = function dropElements(arr, func) {
197         while (arr.length > 0 && !func(arr[0])) {
198             arr.shift();
199         }
200 
201         return arr;
202     };
203     function cc1(n) {
204         return n >= 3;
205     }
206     //console.log(dropElements([2,3,4,5,6],cc1)); //[3,4,5,6]
207 
208     //16.使用Array.map()將start(包含)和end(不包括)之間的值映射到value。 省略開始從第一個元素開始和/或結束到最后一個結束。
209     //理解:
210     //數組[1,2,3,4]對應i 0,1,2,3;如果滿足1=<i<3,就使用“8”對應,否則原值輸出
211     var fillArray = function fillArray(arr, value) {
212         var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
213         var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : arr.length;
214         return arr.map(function (v, i) {
215             return i >= start && i < end ? value : v;
216         });
217     };
218     //console.log(fillArray([1,2,3,4],'8',1,3));//[1,'8','8',4]
219 
220     //17.將Array.filter()用於僅包含唯一值的數組。
221     var filterNonUnique = function filterNonUnique(arr) {
222         return arr.filter(function (i) {
223             return arr.indexOf(i) === arr.lastIndexOf(i);
224         });
225     };
226     //console.log(filterNonUnique([1,1,2,2,3,3,3,5,6,8]));//[5,6,8]
227 
228     //18.使用遞歸,每個深度級別將深度遞減1。 使用Array.reduce()和Array.concat()來合並元素或數組。 基本情況,深度等於1停止遞歸。 省略第二個元素,深度僅變平至1(單個展平)。
229     var flattenDepth = function flattenDepth(arr) {
230         var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
231         return depth != 1 ? arr.reduce(function (a, v) {
232                 return a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v);
233             }, []) : arr.reduce(function (a, v) {
234                 return a.concat(v);
235             }, []);
236     };
237     //console.log(flattenDepth([1,[2],[[[3],4],5]], 2));//[1,2,[3],4,5]
238 
239     //19.使用Array.reduce()獲取數組中的所有元素,並使用concat()來展平它們。
240     var flatten = function flatten(arr) {
241         return arr.reduce(function (a, v) {
242             return a.concat(v);
243         }, []);
244     };
245     //console.log(flatten([1,[2],3,4,[5,6,[7,8,9],10]]));//[1, 2, 3, 4, 5, 6, [7,8,9], 10]
246     //console.log(flatten([1,[2],3,4,[5,6,7,8,9,10]]));//[1,2,3,4,5,6,7,8,9,10]
247 
248     //20.使用Math.max()結合擴展運算符(...)來獲取數組中的最大值。
249     //ES6
250     //const arrayMax = arr => Math.max(...arr);
251     function _toConsumableArray(arr) {
252         return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
253     }
254 
255     function _nonIterableSpread() {
256         throw new TypeError("Invalid attempt to spread non-iterable instance");
257     }
258 
259     function _iterableToArray(iter) {
260         if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
261     }
262 
263     function _arrayWithoutHoles(arr) {
264         if (Array.isArray(arr)) {
265             for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
266                 arr2[i] = arr[i];
267             }
268             return arr2;
269         }
270     }
271 
272     var arrayMax = function arrayMax(arr) {
273         return Math.max.apply(Math, _toConsumableArray(arr));
274     };
275     //console.log(arrayMax([3,4,5,8,10]));//10
276 
277     //21.使用Math.min()結合擴展運算符(...)來獲取數組中的最小值。
278     function _toConsumableArray(arr) {
279         return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
280     }
281 
282     function _nonIterableSpread() {
283         throw new TypeError("Invalid attempt to spread non-iterable instance");
284     }
285 
286     function _iterableToArray(iter) {
287         if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
288     }
289 
290     function _arrayWithoutHoles(arr) {
291         if (Array.isArray(arr)) {
292             for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
293                 arr2[i] = arr[i];
294             }
295             return arr2;
296         }
297     }
298 
299     var arrayMin = function arrayMin(arr) {
300         return Math.min.apply(Math, _toConsumableArray(arr));
301     };
302     //console.log(arrayMin([3,4,5,8,10])); //3
303 
304     //22.使用Array.map()將數組的值映射到函數或屬性名稱。 使用Array.reduce()創建一個對象,其中的鍵是從映射結果生成的。
305     var groupBy = function groupBy(arr, func) {
306         return arr.map(typeof func === 'function' ? func : function (val) {
307                 return val[func];
308             }).reduce(function (acc, val, i) {
309             acc[val] = (acc[val] || []).concat(arr[i]);
310             return acc;
311         }, {});
312     };
313     //console.log(groupBy([6.1, 4.2, 6.3], Math.floor));//{4: [4.2], 6: [6.1, 6.3]}
314 
315     //23.使用arr [0]返回傳遞的數組的第一個元素。
316     var head = function head(arr) {
317         return arr[0];
318     };
319     //console.log(head([3,4,5,6,7])); //3
320 
321     //24.使用arr.slice(0,-1)返回除數組的最后一個元素之外的所有元素。
322     var initial = function initial(arr) {
323         return arr.slice(0, -1);
324     };
325     //console.log(initial([1,3,5,7,9]));//[1, 3, 5, 7]
326 
327     //25.使用Array(end-start)創建所需長度的數組Array.map()以填充范圍內的所需值。 您可以省略start以使用默認值0。
328     var initializeArrayRange = function initializeArrayRange(end) {
329         var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
330         return Array.apply(null, Array(end - start)).map(function (v, i) {
331             return i + start;
332         });
333     };
334     //console.log(initializeArrayRange(6));//[0, 1, 2, 3, 4, 5]
335 
336     //26.使用Array(n)創建所需長度的數組,fill(v)以使用所需的值填充它。 您可以省略值以使用默認值0。
337     var initializeArray = function initializeArray(n) {
338         var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
339         return Array(n).fill(value);
340     };
341     // console.log(initializeArray(7,5));//[5,5,5,5,5,5,5]
342 
343     //27.使用arr.slice(-1)[0]獲取給定數組的最后一個元素。
344     var last = function last(arr) {
345         return arr.slice(-1)[0];
346     };
347     //console.log(last([1,2,3,4,5])); //5
348 
349     //28.找到數組的中間部分,使用Array.sort()對值進行排序。 如果長度為奇數,則返回中點處的數字,否則返回兩個中間數字的平均值。
350     var median = function median(arr) {
351         var mid = Math.floor(arr.length / 2),
352             nums = arr.sort(function (a, b) {
353                 return a - b;
354             });
355         return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
356     };
357     //console.log(median([-3,4,-2,0,4,7])); //2
358     //console.log(median([-3,4,-2,0,4,7,2.5]));//2.5
359 
360     //29.使用Array.slice()獲取包含第一個元素的第n個元素的數組。 如果索引超出范圍,則返回[]。 省略第二個參數n,得到數組的第一個元素。
361     var nth = function nth(arr) {
362         var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
363         return (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
364     };
365     //console.log(nth([2,3,4,5,6]));//2
366     //console.log(nth([2,3,4,5,6],3));//5
367 
368     //30.如果obj中存在鍵,則使用Array.reduce()將過濾/拾取的鍵轉換回具有相應鍵:值對的對象。
369     var pick = function pick(obj, arr) {
370         return arr.reduce(function (acc, curr) {
371             return curr in obj && (acc[curr] = obj[curr]), acc;
372         }, {});
373     };
374     //console.log(pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']));//{a: 1, c: 3}
375     //console.log(pick({'a':1}, ['a', 'c']));//{a: 1}
376 
377     //31.使用Array.sort()在比較器中使用Math.random()重新排序元素。
378     var shuffle = function shuffle(arr) {
379         return arr.sort(function () {
380             return Math.random() - 0.5;
381         });
382     };
383     //console.log(shuffle([4,5,6,7,8,9])); //[5, 4, 7, 8, 9, 6] 隨機數不固定
384 
385     //32.使用filter()刪除不屬於值的值,使用includes()確定。
386     var similarity = function similarity(arr, values) {
387         return arr.filter(function (v) {
388             return values.includes(v);
389         });
390     };
391     //console.log(similarity([3,4,5,6,7,8],[6,7,8,9,0]));//[6,7,8]
392 
393     //33.使用Array.reduce()將每個值添加到累加器,使用值0初始化。
394     var sum = function sum(arr) {
395         return arr.reduce(function (acc, val) {
396             return acc + val;
397         }, 0);
398     };
399     //console.log(sum([3, 4, 5, 6, 7]));//25
400 
401     //34.如果數組的長度大於1,則返回arr.slice(1),否則返回整個數組。
402     var tail = function tail(arr) {
403         return arr.length > 1 ? arr.slice(1) : arr;
404     };
405     //console.log(tail([2,3,4,5]));//[3,4,5]
406     //console.log(tail([2]));//[2]
407 
408     //35.使用Array.slice()創建一個數組切片,其中包含從末尾獲取的n個元素。
409     var takeRight = function takeRight(arr) {
410         var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
411         return arr.slice(arr.length - n, arr.length);
412     };
413     //console.log(takeRight([1, 2, 3, 4, 5], 2));//[4,5]
414     //console.log(takeRight([1, 2, 3]));//[3]
415 
416     //36.使用Array.slice()創建一個數組切片,其中包含從頭開始的n個元素。
417     var take = function take(arr) {
418         var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
419         return arr.slice(0, n);
420     };
421     //console.log(take([1,2,3,4,5,6],4)); //[1,2,3,4]
422     //console.log(take([1,2,3,4,5],0)); //[]
423 
424     //-----------------------以上為ES5寫法-----------------------------------
425 
426     //37.使用ES6 Set和... rest運算符可以丟棄所有重復的值。
427     const unique = arr => [...new Set(arr)];
428     //console.log(unique([1,1,2,3,4,4,5,5,5,6,7,8,8,9])); //[1,2,3,4,5,6,7,8,9]
//###上述ES6中的寫法參考以下地址
//###https://www.awesomes.cn/repo/30-seconds/30-seconds-of-code#array-concatenation


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM