在JS中将对象数组减少为hashmap

Posted

技术标签:

【中文标题】在JS中将对象数组减少为hashmap【英文标题】:Reducing array of objects to hashmap in JS 【发布时间】:2017-10-02 12:19:28 【问题描述】:

您好,我正在尝试将 JSON 数据类型从一种格式转换为另一种格式:

  [  name: 'CarNo', attributes: , children: [], content: '?' ,
        name: 'AccNo', attributes: , children: [], content: '?' ,
      name: 'SCS', attributes: , children: [], content: '?' ]

目标对象将基于 name 属性和 content 属性:

   'CarNo': '?', 'AccNo': '?', 'SCS': '?' 

我想我可以减少这个,但我失败了:

        const filteredResponseObj = Object.keys(rawResponseBodyObj).reduce((p,c)=>
          if( c === 'name' )
            p[c]=rawResponseBodyObj[c].content;
          
          return p;
        ,);

我错过了什么?显然我对减少有一些问题......

【问题讨论】:

【参考方案1】:

你的想法是对的,但这里是如何做到的:

const filteredResponseObj = rawResponseBodyObj.reduce(function(map, obj) 
    map[obj.name] = obj.content;
    return map;
, );

使用Convert object array to hash map, indexed by an attribute value of the Object

【讨论】:

【参考方案2】:

您可以将Object.assign 与spread syntax ...Array#map 一起用于对象生成。

var array = [ name: 'CarNo', attributes: , children: [], content: '?' ,  name: 'AccNo', attributes: , children: [], content: '?' ,  name: 'SCS', attributes: , children: [], content: '?' ],
    result = Object.assign(...array.map(o => ( [o.name]: o.content )));

console.log(result);

【讨论】:

【参考方案3】:

通过c === 'name' 这一行,您尝试将初始数组中的对象与字符串name 进行比较。这样的比较总会给false

正确的方法应该如下:

var arr = [  name: 'CarNo', attributes: , children: [], content: '?' ,
     name: 'AccNo', attributes: , children: [], content: '?' ,
     name: 'SCS', attributes: , children: [], content: '?' ],

    filtered = arr.reduce(function (r, o) 
        if (!r[o.name]) r[o.name] = o['content'];
        return r;
    , );

console.log(filtered);

【讨论】:

以上是关于在JS中将对象数组减少为hashmap的主要内容,如果未能解决你的问题,请参考以下文章

JS:将数组减少为嵌套对象

如何在 vue.js 中将类型数组对象更改为格式对象而不使用循环方法?

在模板中将php数组转换成js对象

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串

JS(ES6):基于对象属性减少数组

如何在javascript中将对象数组过滤为另一个对象数组? [关闭]