首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中从字符串数组中创建分组对象

在JavaScript中从字符串数组中创建分组对象
EN

Stack Overflow用户
提问于 2018-11-16 13:53:57
回答 2查看 506关注 0票数 0

我有一个问题我一直没能解决,基本上我想改变这个:

代码语言:javascript
复制
{
    "seamark:name": "Z-2",
    "seamark:type": "buoy_lateral",
    "seamark:light:range": "5",
    "seamark:light:colour": "red",
    "seamark:light:character": "Q",
    "seamark:radar_reflector": "yes",
    "seamark:buoy_lateral:shape": "can",
    "seamark:buoy_lateral:colour": "red",
    "seamark:buoy_lateral:system": "iala-a",
    "seamark:buoy_lateral:category": "port"
}

这方面:

代码语言:javascript
复制
{
    seamark: {
        name: "Z-2",
        type: "buoy_lateral",
        light: {
            range: "5",
            colour: "red",
            reflector: "yes"
        },
        buoy_lateral: {
            shape: "can",
            colour: "red",
            system: "iala-a",
            category: "port
        }
    }
}

现在,我只实现了一个包含10个对象的数组,每次使用以下链接中显示的代码(例如,{seamark:{name:“Z-2”})到值的路径都是这样的:码页

一旦我在代码页中显示了结果,有人会想到如何对属性进行深度分组吗?或者甚至是另一个主意?提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-16 14:02:47

您正在尝试unflat一个对象。

您可以使用flat npm (https://www.npmjs.com/package/flat)

代码语言:javascript
复制
const { unflatten } = require('flat');

const unflat = unflatten({
    "seamark:name": "Z-2",
    "seamark:type": "buoy_lateral",
    "seamark:light:range": "5",
    "seamark:light:colour": "red",
    "seamark:light:character": "Q",
    "seamark:radar_reflector": "yes",
    "seamark:buoy_lateral:shape": "can",
    "seamark:buoy_lateral:colour": "red",
    "seamark:buoy_lateral:system": "iala-a",
    "seamark:buoy_lateral:category": "port"
}, { delimiter: ":" }); // notice delimiter : default is "."

console.log(unflat);

输出:

代码语言:javascript
复制
{
    seamark: {
        name: 'Z-2',
        type: 'buoy_lateral',
        light: { range: '5', colour: 'red', character: 'Q' },
        radar_reflector: 'yes',
        buoy_lateral:
        {
            shape: 'can',
            colour: 'red',
            system: 'iala-a',
            category: 'port'
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-11-16 20:27:12

您还可以使用"for..of“和"Array.reduce”,如下所示

代码语言:javascript
复制
var obj = {
    "seamark:name": "Z-2",
    "seamark:type": "buoy_lateral",
    "seamark:light:range": "5",
    "seamark:light:colour": "red",
    "seamark:light:character": "Q",
    "seamark:radar_reflector": "yes",
    "seamark:buoy_lateral:shape": "can",
    "seamark:buoy_lateral:colour": "red",
    "seamark:buoy_lateral:system": "iala-a",
    "seamark:buoy_lateral:category": "port"
}


let newObj = {}
for(let [key, val] of Object.entries(obj)) {
  let keys = key.split(':')
  
  keys.reduce((o, d, i) => (
       i == keys.length - 1 
         ? (o[d] = val) 
         : (o[d] = o[d] || {})
       , o[d])
    , newObj)
}

console.log(newObj)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53339230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档