【问题标题】:Convert JSON Object array into associative array将 JSON 对象数组转换为关联数组
【发布时间】:2016-07-30 18:23:29
【问题描述】:

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

资源:

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

资源 ID

[193041, 193041, 193041, 193042]

用例:

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

我的计划:

我认为将我的Resources JSON 转换为关联数组是一个优雅的解决方案,这样我就可以像这样访问AssetIdResourceId '193041':Resources[193041].AssetId。问题:我只能考虑将上面的Resources JSON 转换为关联 JSON 对象的长代码。

问题:

如何将上述Resources JSON 对象数组转换为以ResourceId 为key 的关联对象数组?

所需资源.json:

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

【问题讨论】:

  • 你能显示想要的结果吗?
  • @NenadVracar 确定,已编辑!
  • 顺便说一句,JSON 是一个字符串形式的序列化对象。

标签: javascript json node.js


【解决方案1】:

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

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

并将元素分配给名称为a.ResourceId的属性。

回调使用Arrow function,因为只有一个赋值。

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

【讨论】:

  • 感谢您的回答,您介意详细说明一下吗:data.forEach(a => object[a.ResourceId] = a); ?
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    var Resources = [{
        "DefinitionId": 193041,
        "ResourceId": -2147290607,
        "AssetId": 193041
    }, {
        "DefinitionId": 193042,
        "ResourceId": -2147290603,
        "AssetId": 193042
    }];     
    
    Resources.find(function(value){return value.ResourceId === -2147290603}).AssetId
    

    或使用 lodash/underscore 获得优雅的解决方案: _.find(Resources, {ResourceId : -2147290603}).AssetId;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多