I am using partition function to divide a 1D array into 2 subarrays with distinct keys. Here is my JS program.
//Partition function
function partition(array, filter) {
let pass = [], fail = [];
array.forEach((e, idx, arr) => (filter(e, idx, arr) ? pass : fail).push(e));
return [pass, fail];
}
//Run it with some dummy data and filter
const [lessThan5, greaterThanEqual5] = partition([0,1,4,3,5,7,9,2,4,6,8,9,0,1,2,4,6], e => e < 5);
//Output
console.log(lessThan5);
console.log(greaterThanEqual5);
Output would be:
[
0, 1, 4, 3, 2,
4, 0, 1, 2, 4
]
[
5, 7, 9, 6,
8, 9, 6
]
But if I replace 1D array with 2D arrays containing names and marks, the cut off marks is 34. But the program fails.
//Partition function
function partition(array, filter) {
let pass = [], fail = [];
array.forEach((e, idx, arr) => (filter(e, idx, arr) ? pass : fail).push(e));
return [pass, fail];
}
//Run it with some dummy data and filter
const [lessThan5, greaterThanEqual5] = partition([
{
name: "Mike",
marks: 40
},
{
name: "Suzan",
marks: 20
},
{
name: "David",
marks: 90
},
{
name: "Peter",
marks: 32
}
], e => e < 34);
//Output
console.log(lessThan5);
console.log(greaterThanEqual5);
Output will be:
[]
[
{ name: 'Mike', marks: 40 },
{ name: 'Suzan', marks: 20 },
{ name: 'David', marks: 90 },
{ name: 'Peter', marks: 32 }
]
How can I fix that?
1
The value passed into the filter function is an object with name
and marks
, so you need to do e.marks < 34
:
//Partition function
function partition(array, filter) {
let pass = [], fail = [];
array.forEach((e, idx, arr) => (filter(e, idx, arr) ? pass : fail).push(e));
return [pass, fail];
}
//Run it with some dummy data and filter
const [lessThan5, greaterThanEqual5] = partition([
{
name: "Mike",
marks: 40
},
{
name: "Suzan",
marks: 20
},
{
name: "David",
marks: 90
},
{
name: "Peter",
marks: 32
}
], e => e.marks < 34);
//Output
console.log(lessThan5);
console.log(greaterThanEqual5);