Reputation: 71
I have an arrays of object,
var date = [{age:5, name:"al"},
{age:10, name:"ben"},
{age:15, name:"mac"},
{age:15, name:"sarah"},
{age:20, name:"jack"},
{age:24, name:"dan"}
];
and
var age = [15, 23];
For each age, how can I filter the array (named "data") that contain the exact match, and if there is no exact match, it will return the element that in between (closest lower value & closest upper value)?
For example for this case, for each age (15 and 23) it supposed to give me:
[[{age:15, name:"mac"},{age:15, name:"sarah"}],[{age:20, name:"jack"},{age:24, name:"dan"}]].
I try to use this:
function int(){
var data = [{age:5, name:"al"},
{age:10, name:"ben"},
{age:15, name:"mac"},
{age:15, name:"sarah"},
{age:20, name:"jack"},
{age:24, name:"dan"}
];
var age = [15, 23];
var filterData = age.map(n => data.filter(v => n==v.age));
}
But it only resolved the exact match value. However, I cant figured out how to get for in between values (closest lower & closest upper). In this case, for age 23, i supposed to get [{age:20, name:"jack"},{age:24, name:"dan"}].
Any help or tips would be appreciated. I have searched and cannot find a solution.
Upvotes: 1
Views: 1049
Reputation: 1041
const data = [
{
age: 5,
name: "al"
},
{
age: 10,
name: "ben"
},
{
age: 15,
name: "mac"
},
{
age: 15,
name: "sarah"
},
{
age: 20,
name: "jack"
},
{
age: 24,
name: "dan"
}
];
const age = [15, 23];
function lowerAndUpperBound(value) {
let lower = { age: -1 };
let upper = { age: 9999 };
for (const obj of data) {
if (obj.age === value && lower.age !== value) {
lower = obj;
}
if (obj.age === value && upper.age !== value) {
upper = obj;
}
if (obj.age > lower.age && obj.age < value && lower.age !== value) {
lower = obj;
}
if (obj.age < upper.age && obj.age > value && upper.age !== value) {
upper = obj;
}
}
return [lower, upper];
}
const result = age.map((i) => lowerAndUpperBound(i));
console.log(result);
Upvotes: 2
Reputation: 415
By using filter method on arrays you can select specific element in an array. The first argument of this function is a function named callback.
Each element of array which to call filter on it will pass to callback function then you can set some condition (in your case age between 2 number). For this, arrow function is better choice than functions because it returns simply the value you want.
The includes function is an array function too, which check an element is in the array or not.
After all your code should be something like this:
const data = [{
age: 5,
name: "al"
},
{
age: 10,
name: "ben"
},
{
age: 15,
name: "mac"
},
{
age: 15,
name: "sarah"
},
{
age: 20,
name: "jack"
},
{
age: 24,
name: "dan"
}
];
const age = [15, 23];
const callbackfn = (obj) => age.includes(obj.age)
const result = data.filter(callbackfn);
console.log(result)
Upvotes: 0
Reputation: 2010
Try this, this is very easy to understand .
var date = [{age:5, name:"al"},
{age:10, name:"ben"},
{ age:15, name:"mac"},
{age:15, name:"sarah"},
{age:20, name:"jack"},
{age:24, name:"dan"} ];
var age = [15, 23];
const ans = date.filter(val=>age.includes(val.age)) ;
console.log(ans)
Upvotes: 0
Reputation: 380
Just write an if statement to check if the length of 'filtered' is 0 or not
Also use let instead of Var
function int(d, a){
a = a.sort();
//Basically same thing u wrote
let filtered = d.filter((e)=>age.includes(e.age));
if (filtered.length == 0) {
//Assumes the length of "a" is 2
return d.filter((e)=> e.age >= a[0] && e.age <= a[1])
} else {
//If there is a result, return it
return filtered
}
}
let date1 = [{age:5, name:"al"},
{age:10, name:"ben"},
{age:15, name:"mac"},
{age:15, name:"sarah"},
{age:20, name:"jack"},
{age:24, name:"dan"}
];
let date2 = [{age:5, name:"al"},
{age:10, name:"ben"},
{age:20, name:"jack"},
{age:24, name:"dan"}
];
let age = [15, 23];
console.log(int(date1, age));
// Will result in this, has exact match:
/*
[
{
"age": 15,
"name": "mac"
},
{
"age": 15,
"name": "sarah"
}
]
*/
console.log(int(date2, age));
//Will result in this, has no exact match
/*
[
{
"age": 20,
"name": "jack"
}
]
*/
Upvotes: 1