如何将 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)]
  , []
)

Playground

更新


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;