'2D Array Object to 1D array filter function

Use Case 1
Assuming i have 2dArray Object of

let arr = [{'getName':'Report1'},{'getName':'User'},{'getName':'report 2'},{'getName':'User'},{'getName':'User'}]
let _NotRequiredSheet = ['User','Report 254',...]

Im trying to optimise my script with functional programming which will return me an array of

 ['report1','report2']

The current Method im using which does not have any error is :

 for(let i =0;i < arr.length;i++){
            if(arr[i].getName != _NotRequiredSheet[0]){
                console.log(arr[i].getName)
            }
        }

But this will impact if _notrequiredSheet have a big list of what is not required

I tried using this approach which is using filter but since its 2dObject Array, im unsure how should this be implemented. What i did on my poc is

    //Approach 1 : Not Working 
    let result = arr.filter(function (arr) {
        return arr.getName != _NotRequiredSheet.values();
    })

    //Output should be as 1dArray['report1','report2'] , not (5) [{…}, {…}, {…}, {…}, {…}]
    console.log(result)



    //Approach 2 : Will output as 2D array with filtered value
    // Will require to hardcord the index which is not advisable
    let result = arr.filter(function (arr) {
        return arr.getName != _NotRequiredSheet[0];
    })
    console.log(result)

i wanted to check if there is any way i could pass on using for loop with filter function. Result should return as 1D array which is

['Report1','Report2']

Use case 1 is Solved

Use Case 2 : 2D Object Array Assuming data is declared as

    let arr2 = [
        {$0:{'Name':'Report1'}},
        {$0:{'Name':'Report2'}},
        {$0:{'Name':'User'}}
    ]

Result should show this on console.log (2) [{…}, {…}] , filter function will remove 'User' as its reflected in _NotRequiredSheet.

Using the syntax i wrote

let result = arr2.map(item => item.$0.Name).filter(Name => !_NotRequiredSheet.includes(Name))

This will return as a single array



Solution 1:[1]

I'd recommend using reduce() so you can return something based on _NotRequiredSheet.includes(cur.getName)

let arr = [{'getName':'Report1'},{'getName':'User'},{'getName':'report 2'},{'getName':'User'},{'getName':'User'}]
let _NotRequiredSheet = ['User','Report 254' ];

let res = arr.reduce((prev, cur) => {
    if (_NotRequiredSheet.includes(cur.getName)) {
      return prev;
    } else {
      return [ ...prev, cur.getName ];
    }
}, []);
console.log(res);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 0stone0