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
    }
}

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);

你可以使用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 );

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.

链接地址: http://www.djcxy.com/p/35448.html

上一篇: 在BufferedImage上绘制带有不透明度的圆角矩形

下一篇: 将JSON对象数组转换为关联数组