将JSON对象数组转换为关联数组
假设我有2个JSON对象数组,如下所示:
资源:
[{
"DefinitionId": 193041,
"ResourceId": -2147290607,
"AssetId": 193041
}, {
"DefinitionId": 193042,
"ResourceId": -2147290603,
"AssetId": 193042
}]
ResourceIds
[193041, 193041, 193041, 193042]
用例:
我需要从我的资源JSONObject中为每个ResourceId列出详细信息。 比如我要输出AssetId
为每ResourceId
在ResourceIds
。
我的计划:
我认为这将是一个完美的解决方案,以我的转换Resources
JSON成一个关联数组,这样我就可以访问AssetId
我ResourceId
“193041”是这样的: Resources[193041].AssetId
。 问题:我只能考虑使用长代码将上面的Resources
JSON转换为关联的JSON对象。
问题是:
如何将上面的资源JSON对象数组转换为ResourceId作为关键字的关联对象数组?
期望的Resources.json:
{
"-2147290607": {
"DefinitionId": 193041,
"ResourceId": -2147290607,
"AssetId": 193041
},
"-2147290603": {
"DefinitionId": 193042,
"ResourceId": -2147290603,
"AssetId": 193042
}
}
你可以使用一个对象并用Array#forEach
迭代数组
forEach()
方法为每个数组元素执行一次提供的函数。
并将该元素分配给名称为a.ResourceId
的属性。
回调使用箭头函数,因为只有一个分配。
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 / underscore作为优雅的解决方案:_.find(Resources,{ResourceId:-2147290603})。AssetId;
通过这个,我们可以通过传递ResourceId来找到所需的AssetId。 为简单起见,我们甚至可以跳过JSON的转换。
链接地址: http://www.djcxy.com/p/35447.html