题目
写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值。非重复的数字应该以它们原始的顺序排序,但最终的数组不应该以数字顺序排序。请参照下面验证判断中的例子。如果你被卡住了,记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。
这是一些对你有帮助的资源:
Arguments object
Array.reduce()
function unite(arr1, arr2, arr3) {
return arr1;
}
unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
思路
- 我算是领教这出题人的文字组织水平了,看了半天懵逼状态;
- 后来看到下面的示例,才明白要的是啥
- 不就是说,比对多个数组,去掉后一个数组中在前面已重复的数,然后按照数组的顺序而并不是按照数字的自然排序,存入一个新数组;
- 看了题目提示需要用到 这2个 Arguments object,Array.reduce();
- 于是开始学习这两个函数的用法,发现 Arguments object 比较有用,还可能会用到 contact,indexOf 等;
- 定义2个变量,先将所有数组合并存入一个变量,然后依次判断当前位置的数值是否已经有存在,如果只出现一次,则存入另外一个变量
解答
function unite(arr1, arr2, arr3) {
var A = (Array.from(arguments)).reduce(function(prev,cur,index,array){
return prev.concat(cur); // 用arguments 转换为数组后,合并 arrs 的所有数组;
});
var B =[] ;
for (var i =0; i<=A.length; i++){
if (A.indexOf(A[i]) === i){ // 意思是如果A 里面第一次出现 A[i]的字符为的位置为i,也就是说,A[i]的数值只出现了一次
B.push(A[i]); // 就将这个唯一值存起来
}
}
return B;
}
unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
- 上面有 判断是否出现过几次可以说一下:
比如: A = (1,3,2,4,3)
java script if (A.indexOf(A[i]) === i)
当 i = 1 时,第一次循环,则A[i] 是 3,这个等式是 A.indexOf(A[1]) === 1 是成立的,所以3 会先存起来;当循环到 i = 4 时, A[i] 还是 3,但 A.indexOf(A[4]) === 1 ,等式不成立;