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

1

2 Answers 2

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);

Sign up to request clarification or add additional context in comments.

4 Comments

looks clean, but the complexity is still O(n*m)
try using Set.has() which has O(1)
Clean answer, will look into both set.has()
If in a scenario data is declared as 2d object, let data = [ {$0:{'Name':'Report1'}} ] , using the method provided , .filter(({ $0.getName }) .... will result ',' is expected
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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.