如何将 TypeScript 中的二维数组缩减为 return 唯一子数组的二维数组?
How to reduce a 2D array in TypeScript to return a 2D array of unique subarrays?
我正在尝试减少我的二维数组,以便没有重复的子数组。我使用 .reduce() 方法来解决这个问题,但是我的条件语句似乎并没有像人们想象的那样工作。
请参阅标准输出以获得更多清晰度。如果您知道如何进行这项工作或可能的解决方法,请告诉我。
const unique = result.reduce<number[][]>((accum, curr) => {
if (!accum.includes(curr)) {
console.log('accum:', accum);
console.log('curr', curr);
return [...accum, curr];
}
else{
return accum;
}
}, []);
console.log('\nresult', result);
console.log('unique', unique);
/*
stdout:
accum: []
curr [ 0, -1, 1 ]
accum: [ [ 0, -1, 1 ] ]
curr [ 0, -1, 1 ]
accum: [ [ 0, -1, 1 ], [ 0, -1, 1 ] ]
curr [ 2, -1, -1 ]
result [ [ 0, -1, 1 ], [ 0, -1, 1 ], [ 2, -1, -1 ] ]
unique [ [ 0, -1, 1 ], [ 0, -1, 1 ], [ 2, -1, -1 ] ]
desired output:
unique [ [ 0, -1, 1 ], [ 2, -1, -1 ] ]
*/
只需使用Set
。请记住它只适用于原始值数组
const makeUnique = <T extends string | number | symbol>(arr: T[]) => [...new Set(arr)];
const unique2D = [[1, 1, 2], [2, 2, 2, 1], [3, 3, 3]].reduce<number[][]>((acc, elem) =>
[...acc, makeUnique(elem)]
, []
)
更新
const makeUnique = <T extends string | number | symbol>(arr: T[]) => [...new Set(arr)];
type MainType = number[]
const unique2D = (arr: Array<MainType>) =>
arr.reduce<Array<MainType>>((acc, elem) => [...acc, makeUnique(elem)], [])
const getDublicates = (arr1: Array<MainType>, arr2: MainType) => {
return arr1.reduce((acc, elem, index) =>
elem.length === arr2.length && arr2.every(el => elem.includes(el))
? [...acc, index]
: acc
, [] as MainType)
};
const check = (arr: Array<MainType>) => {
const dublicates = arr.reduce((acc, elem) => makeUnique([...acc, ...getDublicates(arr, [...elem]).slice(1)]), []);
return arr.filter((_, index) => !dublicates.includes(index))
};
const result = check(unique2D([[0, -1, 1], [2, -1, -1], [3, 3], [3], [3], [4], [4]]));
我找到了一个暂时有效的解决方案。如果有人可以用 Set 或 .reduce() 解决它,请告诉我。
const result: number[][] = new Array(); //results obtained later on in code
const Unique: {[key: string]: number} = {}; //store unique results in a hash
const solution: number[][] = new Array();
let target;
//remove possible duplicates:
for (let i = 0; i < result.length; i++) {
let key = JSON.stringify(result[i]);
if (!Unique[key]) {
Unique[key] = 0;
}
}
for (let key in Unique) {
solution.push(JSON.parse(key))
}
return solution;
我正在尝试减少我的二维数组,以便没有重复的子数组。我使用 .reduce() 方法来解决这个问题,但是我的条件语句似乎并没有像人们想象的那样工作。
请参阅标准输出以获得更多清晰度。如果您知道如何进行这项工作或可能的解决方法,请告诉我。
const unique = result.reduce<number[][]>((accum, curr) => {
if (!accum.includes(curr)) {
console.log('accum:', accum);
console.log('curr', curr);
return [...accum, curr];
}
else{
return accum;
}
}, []);
console.log('\nresult', result);
console.log('unique', unique);
/*
stdout:
accum: []
curr [ 0, -1, 1 ]
accum: [ [ 0, -1, 1 ] ]
curr [ 0, -1, 1 ]
accum: [ [ 0, -1, 1 ], [ 0, -1, 1 ] ]
curr [ 2, -1, -1 ]
result [ [ 0, -1, 1 ], [ 0, -1, 1 ], [ 2, -1, -1 ] ]
unique [ [ 0, -1, 1 ], [ 0, -1, 1 ], [ 2, -1, -1 ] ]
desired output:
unique [ [ 0, -1, 1 ], [ 2, -1, -1 ] ]
*/
只需使用Set
。请记住它只适用于原始值数组
const makeUnique = <T extends string | number | symbol>(arr: T[]) => [...new Set(arr)];
const unique2D = [[1, 1, 2], [2, 2, 2, 1], [3, 3, 3]].reduce<number[][]>((acc, elem) =>
[...acc, makeUnique(elem)]
, []
)
更新
const makeUnique = <T extends string | number | symbol>(arr: T[]) => [...new Set(arr)];
type MainType = number[]
const unique2D = (arr: Array<MainType>) =>
arr.reduce<Array<MainType>>((acc, elem) => [...acc, makeUnique(elem)], [])
const getDublicates = (arr1: Array<MainType>, arr2: MainType) => {
return arr1.reduce((acc, elem, index) =>
elem.length === arr2.length && arr2.every(el => elem.includes(el))
? [...acc, index]
: acc
, [] as MainType)
};
const check = (arr: Array<MainType>) => {
const dublicates = arr.reduce((acc, elem) => makeUnique([...acc, ...getDublicates(arr, [...elem]).slice(1)]), []);
return arr.filter((_, index) => !dublicates.includes(index))
};
const result = check(unique2D([[0, -1, 1], [2, -1, -1], [3, 3], [3], [3], [4], [4]]));
我找到了一个暂时有效的解决方案。如果有人可以用 Set 或 .reduce() 解决它,请告诉我。
const result: number[][] = new Array(); //results obtained later on in code
const Unique: {[key: string]: number} = {}; //store unique results in a hash
const solution: number[][] = new Array();
let target;
//remove possible duplicates:
for (let i = 0; i < result.length; i++) {
let key = JSON.stringify(result[i]);
if (!Unique[key]) {
Unique[key] = 0;
}
}
for (let key in Unique) {
solution.push(JSON.parse(key))
}
return solution;