我正在尝试解决这个freecodecamp算法问题,我必须收集两个或更多数组的差异。我使用map来获得数组的差异,但问题是我只得到两个元素;
function sym(args) {
args = [].slice.call(arguments);
var newArr = args.map(function(el, index, arr){
console.log(arr.indexOf(arr[index]));
if(arr.indexOf(arr[index] === -1 )){
// console.log(arr[index]);
return args.push(arr[index]);
}
});
return newArr; // my newArr returns [3, 4] instead of [3,4,5]
}
console.log(sym([1, 2, 3], [5, 2, 1, 4]));
//sym([1, 2, 3], [5, 2, 1, 4]) should return [3, 4, 5]
//sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]) should return [1, 2, 4, 5, 6, 7, 8, 9]
答案 0 :(得分:0)
我认为你的方法不会起作用;你应该用两个数组中的elementos创建一个数组,这样一个.map
就无法完成这项工作。过滤两个数组都应该有效,尽管它可能会留下足够的优化空间。
答案 1 :(得分:0)
我的newArr返回[3,4]而不是[3,4,5]
您正在使用map
,每次迭代只返回一个值(这就是您只获得2个值的原因),在您的情况下您正在检查是否找到了索引(不是项目)
您需要连接所有数组,然后删除重复的数组
<强>级联强>
var newArr = args.reduce( ( a, c ) => a.concat( c ) , []);
按出现次数创建地图
var map = newArr.reduce( (a,c) => ( a[c] = (a[c] || 0) + 1, a ) , {});
迭代并过滤那些值为1的键
var output = Object.keys( map ).filter( s => map[s] === 1 ).map( Number );
<强>演示强>
function sym(args)
{
args = [].slice.call(arguments);
var newArr = args.reduce( ( a, c ) => a.concat( c ) , []);
var map = newArr.reduce( (a,c) => ( a[c] = (a[c] || 0) + 1, a ) , {});
return Object.keys( map ).filter( s => map[s] === 1 ).map( Number );
}
console.log(sym([1, 2, 3], [5, 2, 1, 4]));
答案 2 :(得分:0)
您可以使用对象来计算项目,并仅返回有计数的项目。
function sym(array) {
return array.reduce((a, b) => {
var count = {};
a.forEach(v => count[v] = (count[v] || 0) + 1);
b.forEach(v => count[v] = (count[v] || 0) - 1);
return Object.keys(count).map(Number).filter(k => count[k]);
});
}
console.log(sym([[3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]]));
答案 3 :(得分:0)
您的功能比仅选择唯一值稍微复杂一点,因为您想要将它们过滤掉......并且还接受多个数组。这应该有用。
var sym = (...arrays)=>{
//Concat Items
const allItems = arrays.reduce((a,c)=>a.concat(c), []);
// Identify repeated items
const repeatedItems = allItems.filter((v,i,a)=>a.indexOf(v) !== i);
// Filter repeated items out
const diff = allItems.filter(item=>repeatedItems.indexOf(item) < 0);
console.log(diff);
};
sym([1, 2, 3], [5, 2, 1, 4]); // [3,5,4]
&#13;
答案 4 :(得分:0)
我想我们也可以这样做,因为我们希望在最后订购它们。
有关原始问题的更多详细信息,请查阅以下链接:FreecodeCamp Link: Symmetric Difference
const sym = (...args) => {
// Merge all the different arrays and remove duplicate elements it means elements that are present both on two related arrays
let tab = args.reduce((a, b) => [
...a.filter(i => !b.includes(i)),
...b.filter(j => !a.includes(j))
], []);
// Then remove the rest of duplicated values and sort the obtained array
return Array.from(new Set(tab)).sort((a, b) => a - b);
}
console.log(sym([1, 2, 3, 3], [5, 2, 1, 4])); // [3, 4, 5]
console.log(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])); // [1, 4, 5]
console.log(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]
设置数据结构由于其特性而用于删除重复的值。