kentor
kentor

Reputation: 18504

Convert JSON Object array into associative array

Assuming I have 2 JSON Object arrays, which looks like this:

Resources:

[{
    "DefinitionId": 193041,
    "ResourceId": -2147290607,
    "AssetId": 193041
}, {
    "DefinitionId": 193042,
    "ResourceId": -2147290603,
    "AssetId": 193042
}]

ResourceIds

[193041, 193041, 193041, 193042]

The use-case:

I need to list the details from my Resources JSONObject for each ResourceId. For example I want to output the AssetId for every ResourceId in ResourceIds.

My plan:

I thought it would be an elegant solution to convert my Resources JSON into an associative array, so that I could access the AssetId for my ResourceId '193041' like this: Resources[193041].AssetId . The problem: I could only think about long code to convert my above Resources JSON into an associative JSON object.

The question:

How can I convert the above Resources JSON object array into an associative object array with ResourceId as key?

Desired Resources.json:

{
    "-2147290607": {
        "DefinitionId": 193041,
        "ResourceId": -2147290607,
        "AssetId": 193041
    },
    "-2147290603": {
        "DefinitionId": 193042,
        "ResourceId": -2147290603,
        "AssetId": 193042
    }
}

Upvotes: 7

Views: 2791

Answers (3)

Chetan Raikwal
Chetan Raikwal

Reputation: 148

var Resources = [{
    "DefinitionId": 193041,
    "ResourceId": -2147290607,
    "AssetId": 193041
}, {
    "DefinitionId": 193042,
    "ResourceId": -2147290603,
    "AssetId": 193042
}];     

Resources.find(function(value){return value.ResourceId === -2147290603}).AssetId

or use lodash/underscore for an elegant solution: _.find(Resources, {ResourceId : -2147290603}).AssetId;

With this we can find the required AssetId by just passing the ResourceId. We can even skip the conversion of JSON for simplicity.

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386550

You could use an object and iterate the array with Array#forEach

The forEach() method executes a provided function once per array element.

and assign the element to the property with the name of a.ResourceId.

The callback uses an Arrow function, because there is only one assignment.

var data = [{ "DefinitionId": 193041, "ResourceId": -2147290607, "AssetId": 193041 }, { "DefinitionId": 193042, "ResourceId": -2147290603, "AssetId": 193042 }],
    object = {};

data.forEach(a => object[a.ResourceId] = a);

console.log(object);

Upvotes: 2

stdob--
stdob--

Reputation: 29172

You can use reduce:

var resources = [{
    "DefinitionId": 193041,
    "ResourceId": -2147290607,
    "AssetId": 193041
}, {
    "DefinitionId": 193042,
    "ResourceId": -2147290603,
    "AssetId": 193042
}];

var resourceIds =[193041, 193041, 193041, 193042];

var res = resources.reduce( function(prev, curr) {
  // Check AssetId
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf
  if ( resourceIds.indexOf( curr.AssetId ) >= 0 ) prev[ curr.ResourceId ] = curr;
  return prev;
}, {} );

var resJSON = JSON.stringify( res );

Upvotes: 1

Related Questions