将JSON对象数组转换为关联数组

Convert JSON Object array into associative array

本文关键字:数组 关联 转换 对象 JSON      更新时间:2023-09-26

假设我有2个JSON对象数组,如下所示:

资源:

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

资源ID

[193041, 193041, 193041, 193042]

用例:

我需要列出每个ResourceId的ResourcesJSONObject的详细信息。例如,我想为ResourceIds中的每个ResourceId输出AssetId

我的计划:

我认为将ResourcesJSON转换为关联数组是一个很好的解决方案,这样我就可以访问ResourceId'193041'的AssetId,如下所示:Resources[193041].AssetId。问题是:我只能考虑用长代码将上面的ResourcesJSON转换为关联的JSON对象。

问题:

如何将上面的ResourcesJSON对象数组转换为以ResourceId为键的关联对象数组?

Desired Resources.json:

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

您可以使用对象并使用Array#forEach 迭代数组

forEach()方法对每个数组元素执行一次所提供的函数。

并将该元素分配给名称为CCD_ 11的属性。

回调使用了Arrow函数,因为只有一个赋值。

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

或者使用lodash/下划线来获得优雅的解决方案:_.fund(Resources,{ResourceId:-2147290603}).AssetId;

这样,我们只需传递ResourceId就可以找到所需的AssetId。为了简单起见,我们甚至可以跳过JSON的转换。