Sorted Union
写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。
换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值。
非重复的数字应该以它们原始的顺序排序,但最终的数组不应该以数字顺序排序。
思路:
(1)将arguments转换为二维数组;
(2)将这个二维数组按顺序合并为一维数组,这里要建立两个相同的数组arr和array;
(3)数组arr每循环一次从后面减少一个元素,然后在arr中从后往前查找与array[i]是否还有相同的元素 ,如果有,就在array数组中删除array[i],
总的来说就是用一个数组做查找,用另一个做记录;
知识点:
(1)arguments是一个类似数组的对象, 对应于传递给函数的参数,
arguments虽然与数组类似,但并不能使用数组的一些方法,所以要将他转换为数组;
var args = Array.slice(arguments);
(2)Array.reduce()方法对累加器和数组中的每个元素 (从左到右)应用一个函数,将其减少为单个值;
1 var arr = args.reduce(function (sum, value) { 2 return sum.concat(value); 3 });
(3)Array.pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度,也就是说直接作用于数组;
(4)Array.splice()方法通过删除现有元素和/或添加新元素来更改一个数组的内容,
可以删除也可以替换;
array.splice(i, 1);
(5)Array.lastIndexOf()方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1,
也就是从后往前查;
1 if (arr.lastIndexOf(array[i]) !== -1) { 2 //如果有,就在array数组中删除array[i] 3 array.splice(i, 1); 4 //总的来说就是用一个数组做查找,用另一个做记录 5 }
代码:
1 function unite(arr1, arr2, arr3) { 2 //arguments虽然与数组类似,但并不能使用数组的一些方法,所以要将他转换为数组 3 var args = Array.slice(arguments); 4 //这里我新建了两个同样的数组 5 var arr = args.reduce(function (sum, value) { 6 return sum.concat(value); 7 }); 8 var array = args.reduce(function (sum, value) { 9 return sum.concat(value); 10 }); 11 12 for (var i = array.length; i > 0; i--) { 13 //数组arr每循环一次从后面减少一个元素 14 arr.pop(); 15 //然后在arr中从后往前查找与array[i]是否还有相同的元素 16 if (arr.lastIndexOf(array[i]) !== -1) { 17 //如果有,就在array数组中删除array[i] 18 array.splice(i, 1); 19 //总的来说就是用一个数组做查找,用另一个做记录 20 } 21 } 22 23 return array; 24 } 25 26 unite([1, 2, 3], [5, 2, 1]);