Home > Blockchain >  How to get an array of object values embedded within an array of objects
How to get an array of object values embedded within an array of objects

Time:10-31

I have an array that has objects, within which is an array of objects as shown below.

const property = [
{
    houses: {
        "id": "HT-00001",
        "features": [{ "id": "FT-0001", "name": "balcony"}, { "id": "FT-0002", "name": "wifi"}],
        "opts": [{
            "desc": "House description",
            "bed": 3,
            "bath": 1,
            "location": "Location of property",
            "name": "Name of Property Listing",
            "isDefault": false,
            "listPrice": [{"amount": 123, "currency": "EUR"}]
        }]
    },
    currency: {
        "currency": "EUR"
    }
},
{
    houses: {
        "id": "HT-00002",
        "features": [{ "id": "FT-0003", "name": "tiled floor"}, { "id": "FT-0002", "name": "wifi"}],
        "opts": [{
            "desc": "House description",
            "bed": 3,
            "bath": 1,
            "location": "Location of property",
            "name": "Name of Property Listing",
            "isDefault": false,
            "listPrice": [{"amount": 123, "currency": "EUR"}]
        }]
    },
    currency: {
        "currency": "EUR"
    }
},
{
    houses: {
        "id": "HT-00003",
        "features": [{ "id": "FT-0004", "name": "refrigerator"}, { "id": "FT-0005", "name": "microwave"}],
        "opts": [{
            "desc": "House description",
            "bed": 3,
            "bath": 1,
            "location": "Location of property",
            "name": "Name of Property Listing",
            "isDefault": false,
            "listPrice": [{"amount": 123, "currency": "EUR"}]
        }]
    },
    currency: {
        "currency": "EUR"
    }
},
];

Now, I am getting a challenge extracting a unique list of features name as an array. Take note that the features has objects and it is within houses object which is an object of object of the array that I am dealing with. What I want is just an array of all unique feature names that are within the provided property array. This is what I have tried, even though it is so much confusing and I need your help.

    const allFeatures = property?.map((propertyItem) => {
        let features = Array.from(new Set(propertyItem?.houses?.features?.map(({ name }) => name)));
        return features;
    });

The expected array will be something like: allFeatures = ['balcony', 'wifi', 'tiled floor', 'refrigerator', 'microwave']

CodePudding user response:

Iterate over each "house" object and, further, iterate over each features array within each object. You can use map for that inner iteration, but to get a resulting flattened array use flatMap for the outer iteration. You can then create a set from that, and then get the depuped array from that set.

(Note: in my experience if you put your code all on one line it makes it more difficult to debug.)

const property=[{houses:{id:"HT-00001",features:[{id:"FT-0001",name:"balcony"},{id:"FT-0002",name:"wifi"}],opts:[{desc:"House description",bed:3,bath:1,location:"Location of property",name:"Name of Property Listing",isDefault:!1,listPrice:[{amount:123,currency:"EUR"}]}]},currency:{currency:"EUR"}},{houses:{id:"HT-00002",features:[{id:"FT-0003",name:"tiled floor"},{id:"FT-0002",name:"wifi"}],opts:[{desc:"House description",bed:3,bath:1,location:"Location of property",name:"Name of Property Listing",isDefault:!1,listPrice:[{amount:123,currency:"EUR"}]}]},currency:{currency:"EUR"}},{houses:{id:"HT-00003",features:[{id:"FT-0004",name:"refrigerator"},{id:"FT-0005",name:"microwave"}],opts:[{desc:"House description",bed:3,bath:1,location:"Location of property",name:"Name of Property Listing",isDefault:!1,listPrice:[{amount:123,currency:"EUR"}]}]},currency:{currency:"EUR"}}];

const allFeatures = property.flatMap(obj => {
  return obj.houses.features.map(feature => {
    return feature.name;
  });
});

const deduped = [...new Set(allFeatures)];

console.log(deduped);

CodePudding user response:

As @andy has indicated Array#flatMap, Array#map and [...new Set(features)] is the way to go. Here, I'm using arrow functions and Object destructuring as well.

const property = [ { houses: { "id": "HT-00001", "features": [{ "id": "FT-0001", "name": "balcony"}, { "id": "FT-0002", "name": "wifi"}], "opts": [{ "desc": "House description", "bed": 3, "bath": 1, "location": "Location of property", "name": "Name of Property Listing", "isDefault": false, "listPrice": [{"amount": 123, "currency": "EUR"}] }] }, currency: { "currency": "EUR" } }, { houses: { "id": "HT-00002", "features": [{ "id": "FT-0003", "name": "tiled floor"}, { "id": "FT-0002", "name": "wifi"}], "opts": [{ "desc": "House description", "bed": 3, "bath": 1, "location": "Location of property", "name": "Name of Property Listing", "isDefault": false, "listPrice": [{"amount": 123, "currency": "EUR"}] }] }, currency: { "currency": "EUR" } }, { houses: { "id": "HT-00003", "features": [{ "id": "FT-0004", "name": "refrigerator"}, { "id": "FT-0005", "name": "microwave"}], "opts": [{ "desc": "House description", "bed": 3, "bath": 1, "location": "Location of property", "name": "Name of Property Listing", "isDefault": false, "listPrice": [{"amount": 123, "currency": "EUR"}] }] }, currency: { "currency": "EUR" } } ],

      features = [...new Set(
          property.flatMap( 
              ({houses:{features}}) => features.map(({name}) => name)
          )
      )];
      
console.log( features );

  • Related