myzat
myzat

Reputation: 71

Value in between javascript

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

Answers (4)

Mohit Kushwaha
Mohit Kushwaha

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

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

Hritik Sharma
Hritik Sharma

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

MatthewProSkils
MatthewProSkils

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

Related Questions