1

I have a JavaScript Object and I'm looking forward to map() it's Id with another id in the same JavaScript Object, my JavaScript Object Schema is

var items = [
  {
    BossId: "03",
    DateOfBirth: "1966-09-27T00:00:00",
    FamilyName: "Montejano",
    Gender: "Unspecified",
    GivenName: "Trinh",
    Id: "08",
    Title: "Tech Manager"
  },
  {
    BossId: "00",
    DateOfBirth: "1927-01-29T00:00:00",
    FamilyName: "Fetzer",
    Gender: "Unspecified",
    GivenName: "Winfred",
    Id: "00",
    Title: "CEO"
  },
  {
    BossId: "01",
    DateOfBirth: "1927-08-20T00:00:00",
    FamilyName: "Dandrea",
    Gender: "Male",
    GivenName: "Erich",
    Id: "02",
    Title: "VP of Marketing"
  },
  {
    BossId: "01",
    DateOfBirth: "1929-02-07T00:00:00",
    FamilyName: "Nisbet",
    Gender: "Male",
    GivenName: "Reinaldo",
    Id: "03",
    Title: "VP of Technology"
  },
  {
    BossId: "01",
    DateOfBirth: "1932-06-13T00:00:00",
    FamilyName: "Bufford",
    Gender: "Unspecified",
    GivenName: "Alleen",
    Id: "04",
    Title: "VP of HR"
  },
  {
    BossId: "02",
    DateOfBirth: "1936-09-26T00:00:00",
    FamilyName: "Klopfer",
    Gender: "Female",
    GivenName: "Kristyn",
    Id: "05",
    Title: "Director of Marketing"
  },
  {
    BossId: "01",
    DateOfBirth: "1937-11-23T00:00:00",
    FamilyName: "Duhon",
    Gender: "Male",
    GivenName: "Sophie",
    Id: "01",
    Title: "Tech Manager"
  },
  {
    BossId: "03",
    DateOfBirth: "1948-04-05T00:00:00",
    FamilyName: "Mirabal",
    Gender: "Female",
    GivenName: "Suanne",
    Id: "07",
    Title: "Tech Manager"
  },
  {
    BossId: "04",
    DateOfBirth: "1966-10-13T00:00:00",
    FamilyName: "Maslowski",
    Gender: "Unspecified",
    GivenName: "Norah",
    Id: "09",
    Title: "Tech Manager"
  },
  {
    BossId: "06",
    DateOfBirth: "1967-08-25T00:00:00",
    FamilyName: "Redford",
    Gender: "Female",
    GivenName: "Gertrudis",
    Id: "10",
    Title: "Tech Lead"
  },
  {
    BossId: "06",
    DateOfBirth: "1968-12-26T00:00:00",
    FamilyName: "Tobey",
    Gender: "Male",
    GivenName: "Donovan",
    Id: "11",
    Title: "Tech Lead"
  },
  {
    BossId: "09",
    DateOfBirth: "1969-10-16T00:00:00",
    FamilyName: "Vermeulen",
    Gender: "Male",
    GivenName: "Rich",
    Id: "12",
    Title: "Trainer Lead"
  },
  {
    BossId: "09",
    DateOfBirth: "1972-10-16T00:00:00",
    FamilyName: "Knupp",
    Gender: "Male",
    GivenName: "Santo",
    Id: "13",
    Title: "HR Manager"
  },
  {
    BossId: "12",
    DateOfBirth: "1974-03-23T00:00:00",
    FamilyName: "Grooms",
    Gender: "Female",
    GivenName: "Jazmin",
    Id: "14",
    Title: "Trainer"
  },
  {
    BossId: "13",
    DateOfBirth: "1978-08-25T00:00:00",
    FamilyName: "Cheeks",
    Gender: "Female",
    GivenName: "Annelle",
    Id: "15",
    Title: "Recruiter"
  },
  {
    BossId: "15",
    DateOfBirth: "1979-08-21T00:00:00",
    FamilyName: "Harshaw",
    Gender: "Unspecified",
    GivenName: "Eliza",
    Id: "16",
    Title: "Trainer"
  },
  {
    BossId: "08",
    DateOfBirth: "1980-02-09T00:00:00",
    FamilyName: "Broaddus",
    Gender: "Unspecified",
    GivenName: "Xiomara",
    Id: "17",
    Title: "Senior Software Developer"
  },
  {
    BossId: "11",
    DateOfBirth: "1981-09-08T00:00:00",
    FamilyName: "Jungers",
    Gender: "Unspecified",
    GivenName: "Erminia",
    Id: "18",
    Title: "Software Developer"
  },
  {
    BossId: "10",
    DateOfBirth: "1984-03-18T00:00:00",
    FamilyName: "Moffatt",
    Gender: "Female",
    GivenName: "Maria",
    Id: "19",
    Title: "Software Developer"
  },
  {
    BossId: "10",
    DateOfBirth: "1990-09-24T00:00:00",
    FamilyName: "Grimaldo",
    Gender: "Female",
    GivenName: "Tammera",
    Id: "20",
    Title: "Senior Software Developer"
  },
  {
    BossId: "10",
    DateOfBirth: "1992-06-18T00:00:00",
    FamilyName: "Das",
    Gender: "Female",
    GivenName: "Sharyl",
    Id: "21",
    Title: "Software Developer"
  },
  {
    BossId: "08",
    DateOfBirth: "1993-11-15T00:00:00",
    FamilyName: "Harlan",
    Gender: "Unspecified",
    GivenName: "Shan",
    Id: "22",
    Title: "UI Developer"
  },
  {
    BossId: "11",
    DateOfBirth: "1997-03-23T00:00:00",
    FamilyName: "Almeida",
    Gender: "Female",
    GivenName: "Mariah",
    Id: "23",
    Title: "QA Tester"
  },
  {
    BossId: "11",
    DateOfBirth: "1998-11-10T00:00:00",
    FamilyName: "Kerfien",
    Gender: "Male",
    GivenName: "Darnell",
    Id: "24",
    Title: "QA Tester"
  },
  {
    BossId: "11",
    DateOfBirth: "2004-04-22T00:00:00",
    FamilyName: "Vierra",
    Gender: "Female",
    GivenName: "Janell",
    Id: "25",
    Title: "QA Tester"
  }
];

I'd like to create a function that when provided with a BossId will output a list of employees who report to that boss. For example, the output for BossId '03' would be

[
  {
    "BossId": "03",
    "DateOfBirth": "1966-09-27T00:00:00",
    "FamilyName": "Montejano",
    "Gender": "Unspecified",
    "GivenName": "Trinh",
    "Id": "08",
    "Title": "Tech Manager"
  },
  {
    "BossId": "03",
    "DateOfBirth": "1948-04-05T00:00:00",
    "FamilyName": "Mirabal",
    "Gender": "Female",
    "GivenName": "Suanne",
    "Id": "07",
    "Title": "Tech Manager"
  }
]

What I've tried:

items.map(res => ({
  ...res.Users,
  Users: items
    .filter(id => id.Id == id.BossId)
    .map(({ Id, ...rest }) => rest)
  }))
17
  • Please post the rest of your component n the question. Commented Dec 19, 2018 at 20:23
  • @AndrewL that is the only component I'm working with, you'll find whole component on Sandbox link Commented Dec 19, 2018 at 20:27
  • 1
    Code in external links are not allowed here. Please post the whole component in the question itself. Commented Dec 19, 2018 at 20:29
  • 1
    Please read the usage description of the json tag... This is not about JSON. Commented Dec 19, 2018 at 20:39
  • 2
    1. The React code is not relevant to your question 2. The expected output of a function that retrieves subordinates by BossId for an example using the input you've provided and a BossId of '03' would produce a list of two employees, not this entire nested output you've shown Commented Dec 19, 2018 at 20:59

3 Answers 3

1

You should be using filter instead of map. Map always creates an array of the same length as the original, while filtering will produce a subset:

function getItemsByBossId (items, id) {
  return items.filter(item => item.BossId === id)
}
Sign up to request clarification or add additional context in comments.

Comments

0

You can go a step further and create a generic filter function for any property (or combination thereof) like this:

function filterItemsBy (items, filter = {}) {
  const filterBy = Object.entries(filter).reduce(
    (acc, [key, value]) => item => item[key] === value && acc(item),
    () => true
  )

  return items.filter(filterBy)
}

// usage
const items = [{BossId:'03',DateOfBirth:'1966-09-27T00:00:00',FamilyName:'Montejano',Gender:'Unspecified',GivenName:'Trinh',Id:'08',Title:'Tech Manager'},{BossId:'00',DateOfBirth:'1927-01-29T00:00:00',FamilyName:'Fetzer',Gender:'Unspecified',GivenName:'Winfred',Id:'00',Title:'CEO'},{BossId:'01',DateOfBirth:'1927-08-20T00:00:00',FamilyName:'Dandrea',Gender:'Male',GivenName:'Erich',Id:'02',Title:'VP of Marketing'},{BossId:'01',DateOfBirth:'1929-02-07T00:00:00',FamilyName:'Nisbet',Gender:'Male',GivenName:'Reinaldo',Id:'03',Title:'VP of Technology'},{BossId:'01',DateOfBirth:'1932-06-13T00:00:00',FamilyName:'Bufford',Gender:'Unspecified',GivenName:'Alleen',Id:'04',Title:'VP of HR'},{BossId:'02',DateOfBirth:'1936-09-26T00:00:00',FamilyName:'Klopfer',Gender:'Female',GivenName:'Kristyn',Id:'05',Title:'Director of Marketing'},{BossId:'01',DateOfBirth:'1937-11-23T00:00:00',FamilyName:'Duhon',Gender:'Male',GivenName:'Sophie',Id:'01',Title:'Tech Manager'},{BossId:'03',DateOfBirth:'1948-04-05T00:00:00',FamilyName:'Mirabal',Gender:'Female',GivenName:'Suanne',Id:'07',Title:'Tech Manager'},{BossId:'04',DateOfBirth:'1966-10-13T00:00:00',FamilyName:'Maslowski',Gender:'Unspecified',GivenName:'Norah',Id:'09',Title:'Tech Manager'},{BossId:'06',DateOfBirth:'1967-08-25T00:00:00',FamilyName:'Redford',Gender:'Female',GivenName:'Gertrudis',Id:'10',Title:'Tech Lead'},{BossId:'06',DateOfBirth:'1968-12-26T00:00:00',FamilyName:'Tobey',Gender:'Male',GivenName:'Donovan',Id:'11',Title:'Tech Lead'},{BossId:'09',DateOfBirth:'1969-10-16T00:00:00',FamilyName:'Vermeulen',Gender:'Male',GivenName:'Rich',Id:'12',Title:'Trainer Lead'},{BossId:'09',DateOfBirth:'1972-10-16T00:00:00',FamilyName:'Knupp',Gender:'Male',GivenName:'Santo',Id:'13',Title:'HR Manager'},{BossId:'12',DateOfBirth:'1974-03-23T00:00:00',FamilyName:'Grooms',Gender:'Female',GivenName:'Jazmin',Id:'14',Title:'Trainer'},{BossId:'13',DateOfBirth:'1978-08-25T00:00:00',FamilyName:'Cheeks',Gender:'Female',GivenName:'Annelle',Id:'15',Title:'Recruiter'},{BossId:'15',DateOfBirth:'1979-08-21T00:00:00',FamilyName:'Harshaw',Gender:'Unspecified',GivenName:'Eliza',Id:'16',Title:'Trainer'},{BossId:'08',DateOfBirth:'1980-02-09T00:00:00',FamilyName:'Broaddus',Gender:'Unspecified',GivenName:'Xiomara',Id:'17',Title:'Senior Software Developer'},{BossId:'11',DateOfBirth:'1981-09-08T00:00:00',FamilyName:'Jungers',Gender:'Unspecified',GivenName:'Erminia',Id:'18',Title:'Software Developer'},{BossId:'10',DateOfBirth:'1984-03-18T00:00:00',FamilyName:'Moffatt',Gender:'Female',GivenName:'Maria',Id:'19',Title:'Software Developer'},{BossId:'10',DateOfBirth:'1990-09-24T00:00:00',FamilyName:'Grimaldo',Gender:'Female',GivenName:'Tammera',Id:'20',Title:'Senior Software Developer'},{BossId:'10',DateOfBirth:'1992-06-18T00:00:00',FamilyName:'Das',Gender:'Female',GivenName:'Sharyl',Id:'21',Title:'Software Developer'},{BossId:'08',DateOfBirth:'1993-11-15T00:00:00',FamilyName:'Harlan',Gender:'Unspecified',GivenName:'Shan',Id:'22',Title:'UI Developer'},{BossId:'11',DateOfBirth:'1997-03-23T00:00:00',FamilyName:'Almeida',Gender:'Female',GivenName:'Mariah',Id:'23',Title:'QA Tester'},{BossId:'11',DateOfBirth:'1998-11-10T00:00:00',FamilyName:'Kerfien',Gender:'Male',GivenName:'Darnell',Id:'24',Title:'QA Tester'},{BossId:'11',DateOfBirth:'2004-04-22T00:00:00',FamilyName:'Vierra',Gender:'Female',GivenName:'Janell',Id:'25',Title:'QA Tester'}]

console.log(filterItemsBy(items, { BossId: '03' }))

5 Comments

This is a very readable function by far and flexible as well, but by generic, doesn't it means it has drawbacks?
If I had to list any drawbacks, I'd say that it requires the caller to specify an object with key-pair entries instead of a single value where the key is hard-coded in the implementation. But even that "drawback" allows the caller to be self-documenting, so it's hardly a drawback at all. You can even call it with filterItemsBy(items, { BossId: '03', Gender: 'Female' }) and it will list only the one matching entry in your example data without having to rewrite the implementation for each property.
It took me time to understand the function, and I did before your comment, thank you for your insight. As I pointed out before this function is very flexible in ways to use.
What if items is not a variable but stored in an external JSON file?
@YashKaranke loading data from external files is a separate concern. Don't mix your concerns; load the data then filter it once it's available in memory. The scope of this question and answer only addresses the concern of filtering data.
0

You can use filter (as mentioned by djfdev) or create a function by yourself like this

 function provideID (mainItem, id) {
    let arrayData = [] //We will push data to this array 
    for (let i=0; i<mainItem.length; i++) {
        if (Number(mainItem[i]["BossId"]) === id) arrayData.push(mainItem[i])
    }
    return arrayData;
  }

  console.log(provideID(items, 10))

here mainItem is your data array object and Id is the BossID corresponding to which you need to have data

Just keep in mind that you are most likely going to pass integer and your BossID is a string so you need to convert one of them.

Above, I have converted BossID to number. if you don't need that, you can just do

if (mainItem[i]["BossId"] === id) arrayData.push(mainItem[i])

2 Comments

your variable name mainItems is wrong inside function.
Thanks a lot for pointing it out. Previously wrote a function which just takes in ID thinking items is in global scope but later saw another answer where answerer passed the array object as well.

Your Answer

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