从多个数组中获取唯一值
Get unique values from multiple arrays
这是我的数组:
var a = [A];
var b = [F, A];
var c = [B, A];
var d = [C, B, A];
var e = [D, C, B, A];
var f = [E, C, B, A];
var g = [G, E, C, B, A];
我想运行一个函数并得到只出现一次的元素列表,所以输出应该是:
[F, D, G]
谢谢!
您可以使用一个对象来存储每个值的频率,并只获取频率为1的条目。下面的代码使用 .flat(Infinity)
来确保它适用于任何级别的嵌套数组;如果您没有任何嵌套数组,只需使用 .flat()
即可。
var a = ['A'];
var b = ['F', 'A'];
var c = ['B', 'A'];
var d = ['C', 'B', 'A'];
var e = ['D', 'C', 'B', 'A'];
var f = ['E', 'C', 'B', 'A'];
var g = ['G', 'E', 'C', 'B', 'A'];
function getUniqueValues(...args){
return Object.entries(
args.flat(Infinity)
.reduce((acc,curr)=>(acc[curr] = (acc[curr] ?? 0) + 1, acc), {})
).filter(([key,val])=>val===1).map(([key])=>key);
}
console.log(getUniqueValues(a,b,c,d,e,f,g));
这个解决方案的复杂度可能不太好
const input: string[][] =
[['A'],
['F', 'A'],
['B', 'A'],
['C', 'B', 'A'],
['D', 'C', 'B', 'A'],
['E', 'C', 'B', 'A'],
['G', 'E', 'C', 'B', 'A']];
let output: string[] = [];
let flagged: string[] = [];
input.filter(innerArray => {
innerArray.filter(elem => {
if(!output.includes(elem) && !flagged.includes(elem))
output.push(elem);
else
{
flagged.push(elem);
output = output.filter(i => { return i !== elem });
}
});
});
console.log(output);
这是我的数组:
var a = [A];
var b = [F, A];
var c = [B, A];
var d = [C, B, A];
var e = [D, C, B, A];
var f = [E, C, B, A];
var g = [G, E, C, B, A];
我想运行一个函数并得到只出现一次的元素列表,所以输出应该是:
[F, D, G]
谢谢!
您可以使用一个对象来存储每个值的频率,并只获取频率为1的条目。下面的代码使用 .flat(Infinity)
来确保它适用于任何级别的嵌套数组;如果您没有任何嵌套数组,只需使用 .flat()
即可。
var a = ['A'];
var b = ['F', 'A'];
var c = ['B', 'A'];
var d = ['C', 'B', 'A'];
var e = ['D', 'C', 'B', 'A'];
var f = ['E', 'C', 'B', 'A'];
var g = ['G', 'E', 'C', 'B', 'A'];
function getUniqueValues(...args){
return Object.entries(
args.flat(Infinity)
.reduce((acc,curr)=>(acc[curr] = (acc[curr] ?? 0) + 1, acc), {})
).filter(([key,val])=>val===1).map(([key])=>key);
}
console.log(getUniqueValues(a,b,c,d,e,f,g));
这个解决方案的复杂度可能不太好
const input: string[][] =
[['A'],
['F', 'A'],
['B', 'A'],
['C', 'B', 'A'],
['D', 'C', 'B', 'A'],
['E', 'C', 'B', 'A'],
['G', 'E', 'C', 'B', 'A']];
let output: string[] = [];
let flagged: string[] = [];
input.filter(innerArray => {
innerArray.filter(elem => {
if(!output.includes(elem) && !flagged.includes(elem))
output.push(elem);
else
{
flagged.push(elem);
output = output.filter(i => { return i !== elem });
}
});
});
console.log(output);