0

Given this json object

{
    "contacts": [
        {
            "name": "Jane doe",
            "numbers": [
                {
                    "number": "07123456789"
                }
            ],
            "groups": [
                {
                    "group": "Everyone"
                },
                {
                    "group": "Exec"
                }
            ]
        }, 
        {
            "name": "John Smith",
            "numbers": [
                {
                    "number": "07987654321"
                }
            ],
            "groups": [
                {
                    "group": "Everyone"
                }
            ]
        }
    ]
}

How do I return a new array of telephone numbers where the group equals a given value.

So, for example, I'd expect a single array of "07123456789" where the contact group = "Exec"

Also, where the Group = "Everyone" i'd expect an array of 2 items: "07123456789" and "07987654321"

I've tried:

 var data = require('../data/data.json')

 var peopleInGroup = data.contacts.filter(function (value) {
     value.groups.filter(function (type) {
         return type.group === recipients[i];
     })
 });

recipients is an array of groups "Everyone, "Exec", "Overseas"

wayneOS
  • 1,427
  • 1
  • 14
  • 20
Codesight
  • 317
  • 2
  • 14

4 Answers4

1

Following this post i changed the second most upvoted answer code a bit to have this :

const getContactsByGroupName = (groupName) => {
    return a.contacts
        .filter((element) =>
            element.groups.some((subElement) => subElement.group === groupName))
        .map(element => {
            return Object.assign({}, element, { group: element.groups.filter(subElement => subElement.group === groupName) });
        });
}

console.log(getContactsByGroupName("Exec"))

This should do the trick. the variable a here is of course your json object name

user 007
  • 821
  • 10
  • 31
1

The following can do what you want with simply using the Array prototype methods:

function filterByGroup(obj, val) {

    const objArray = obj.contacts.filter((innerObj, index, array) => {
            a = innerObj.groups.filter(group => group.group === val)
            return a.length > 0 ? innerObj : false;
    });

    return (objArray.map(obj => obj.numbers.map( number =>number.number))).flat();

}

You can then call it:

filterByGroup(obj, 'Exec')

Where obj is your initial object!

MrfksIV
  • 900
  • 6
  • 16
1

Here is piece of code which creates a JSON which has three groups of numbers:

final_data = {"Everyone": [], "Exec": [], "Overseas": [] }
data.contacts.forEach( (contact) => {
    contact.groups.forEach(group => {
        final_data[group.group].push(contact.numbers);
    })
})

console.log(final_data);
0

You could simply run trough every entry of contacts and generate an output-object containing arrays of numbers for each group. Here is an example.

var input_json = {
    "contacts": [
        {
            "name": "Jane doe",
            "numbers": [
                {
                    "number": "07123456789"
                }
            ],
            "groups": [
                {
                    "group": "Everyone"
                },
                {
                    "group": "Exec"
                }
            ]
        }, 
        {
            "name": "John Smith",
            "numbers": [
                {
                    "number": "07987654321"
                }
            ],
            "groups": [
                {
                    "group": "Everyone"
                }
            ]
        }
    ]
}

//define the output objects that will contain the number-arrays by group-key
var output = {}

//run trough every contact
for (let i in input_json.contacts)
    
    //run trough every group of current contact
    for (let j in input_json.contacts[i].groups)
        
        //run trough every contact-number for current contact-group
        for (let k in input_json.contacts[i].numbers)
            
            //if group-key already exists in output -> push number in array
            if (output[input_json.contacts[i].groups[j].group])
                output[input_json.contacts[i].groups[j].group].push (input_json.contacts[i].numbers[k].number)
            
            //if group-key does not exist -> add new key-array pair
            else
                 output[input_json.contacts[i].groups[j].group] = [input_json.contacts[i].numbers[k].number]
            
//write output as JSON to document
document.write (JSON.stringify (output))
wayneOS
  • 1,427
  • 1
  • 14
  • 20