挑战:
参考:对等差分
创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组.
给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2, 3, 4}),
而数学术语 “对等差分” 的集合就是指由所有只在两个集合其中之一的元素组成的集合
(A △ B = C = {1, 4}).
对于传入的额外集合 (如 D = {2, 3}),
你应该安装前面原则求前两个集合的结果与新集合的对等差分集合
(C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).
例如:
sym([1, 2, 3], [5, 2, 1, 4])
应该返回 [3, 4, 5].
sym([1, 2, 3], [5, 2, 1, 4])
应该只包含三个元素.
sym([1, 2, 5], [2, 3, 5], [3, 4, 5])
应该返回 [1, 4, 5]
sym([1, 2, 5], [2, 3, 5], [3, 4, 5])
应该只包含三个元素.
sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])
应该返回 [1, 4, 5].
sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])
应该只包含三个元素.
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])
应该返回 [2, 3, 4, 6, 7].
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])
应该只包含五个元素.
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])
应该返回 [1, 2, 4, 5, 6, 7, 8, 9].
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])
应该只包含八个元素.
答案:
方法 | 描述 |
---|---|
Array 对象 | 用于在单个的变量中存储多个值。 |
from() | 通过给定的对象中创建一个数组。 |
arguments | 是一个由函数的参数组成的类数组对象。 |
reduce() | 将数组元素计算为一个值(从左到右)。 |
filter() | 检测数值元素,并返回符合条件所有元素的数组。 |
concat() | 连接两个或更多的数组,并返回结果。 |
indexOf() | 搜索数组中的元素,并返回它所在的位置。 |
Set() | Set 中的元素是唯一的,没有重复的值。去重!!! |
new 运算符 | 创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 |
function sym(){
//把多个数组参数合并成一个数组
var args = Array.from(arguments);
args = args.reduce( (arr1, arr2) => {
var tArr1 = [];
var tArr2 = [];
//查找arr1中有,arr2中没有的数
tArr1 = arr1.filter(i => arr2.indexOf(i) < 0)
//查找arr2中有,arr1中没有的数
tArr2 = arr2.filter(i => arr1.indexOf(i) < 0)
return tArr1.concat(tArr2);
}, []);
//构造一个没有重复值的数组
return Array.from(new Set(args));
}
sym([1, 2, 3], [5, 2, 1, 4]);
运行结果:
[3,5,4]
在线测试: