1

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

Farid Arshad
  • 334
  • 2
  • 14
  • First [map the objects to their property value](https://stackoverflow.com/questions/19590865/from-an-array-of-objects-extract-value-of-a-property-as-array). Then [filter out the elements present in the other array](https://stackoverflow.com/questions/19957348/remove-all-elements-contained-in-another-array). – Ivar Jan 24 '22 at 10:19

2 Answers2

1

You could filter your data with looking for unwanted values and map only the wanted property.

const
    data = [{ getName: 'Report1' }, { getName: 'User' }, { getName: 'report 2' }, { getName: 'User' }, { getName: 'User' }],
    _NotRequiredSheet = ['User', 'Report 254'],
    result = data
        .filter(({ getName }) => !_NotRequiredSheet.includes(getName))
        .map(({ getName }) => getName);

console.log(result);

With a Set

const
    data = [{ getName: 'Report1' }, { getName: 'User' }, { getName: 'report 2' }, { getName: 'User' }, { getName: 'User' }],
    _NotRequiredSheet = ['User', 'Report 254'],
    take = k => o => o[k],
    hasNot = s => v => !s.has(v),
    comp = f => g => o => f(g(o)),
    result = data
        .filter(
            comp(hasNot(new Set(_NotRequiredSheet)))(take('getName'))
        )
        .map(({ getName }) => getName);

console.log(result);
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
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);
0stone0
  • 34,288
  • 4
  • 39
  • 64