一个函数将未知数量的数组作为参数。这些数组也可以由嵌套数组组成。我需要抛出重复并返回一个新数组(不重复)。数组元素不应以排序的方式出现,而应按其顺序排列,并位于其原始数组中。
我使用map
将每个数组推入一个新数组。
我用reduce
来连接数组。
我用Set
扔了重复的东西。
仅在这种情况下有效
uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]);
我不知道,为什么在这些情况下它不起作用:
Argument Fail1 // uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
Argument Fail2 // uniteUnique([1, 3, 2], [1, [5]], [2, [4]]);
Argument Fail3 // uniteUnique([1, 2, 3], [5, 2, 1]);
这是我的代码
function uniteUnique(arr) {
let test = [];
arr.map(function(argu) {
test.push(argu);
}, []);
let flat = test.reduce(function(a, b) {
return a.concat(b);
});
let unique = new Set(flat);
console.log(unique);
}
怎么了?如果有人可以告诉我,为什么我的代码不能与Argument Fail 1-3(参数失败1-3)一起使用,将是非常好。
在这些情况下引发的错误是:
返回a.concat(b); / n TypeError:a.concat不是函数
预期输出:
uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])
应该返回[1, 3, 2, 5, 4]
。
uniteUnique([1, 3, 2], [1, [5]], [2, [4]])
应该返回[1, 3, 2, [5], [4]]
。
uniteUnique([1, 2, 3], [5, 2, 1])
应该返回[1, 2, 3, 5]
。
uniteUnique([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])
应该返回[1, 2, 3, 5, 4, 6, 7, 8]
。
答案 0 :(得分:4)
您可以检查该项目是否为数组并将其平整。
const
flat = array => array.reduce((r, a) => r.concat(Array.isArray(a) ? flat(a) : a), []),
uniteUnique = (...array) => [...new Set(flat(array))];
console.log(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.log(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
这是因为您的函数签名仅采用一个参数arr
。在这里,您只传递了一个:
uniteUnique([[1、2、3],[5、2、1],[2、3、4]]);
这就是它起作用的原因。在失败情况下,您需要传递多个数组:
uniteUnique([1,3,2],[5,2,1,4],[2,1]);
因此,只需要[1, 3, 2]
,忽略其他元素,并尝试从第一个元素1
开始缩小第一个,显然这不是数组,并且没有{{ 1}}。
您要做的是更改方法签名-并删除无用的concat
:
map
使用spread syntax将function uniteUnique(...test) {
let flat = test.reduce(function(a, b) {
return a.concat(b);
});
let unique = new Set(flat);
console.log(unique);
}
的所有参数作为数组放入。
顺便说一句,您也可以在实现的地方使用Array.flat(或在没有的地方使用polyfill):
test
而且,如果要使用数组而不是const flatUnique = (...test) => new Set(test.flat())
,则可以再次使用扩展语法将其取回:
Set
答案 2 :(得分:0)
const uniteUnique = (array) => [...new Set(array.flat(Infinity))];
console.log(uniteUnique([[1, 2, 3], [5, 2, 1], [2, 3, 4]]));
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
console.log(uniteUnique([1, 3, 2], [1, [5]], [2, [4]]));
console.log(uniteUnique([1, 2, 3], [5, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }