将点符号键字符串合并到 Object

如何解决将点符号键字符串合并到 Object

我被难住了。我有一个看起来像这样的对象:

{
    "sys": {
        "subject": "","preview_text": "","show_view_in_browser": true,"email_webview_url": "","rep_alert": true,"signatures": {
            "show_joshua": true,"show_warren": true,"show_david": true
        },"email_address": "","show_unsub_link": true,"unsubscribe_link": ""
    },"pre_intro": {
        "content__rtf": ""
    },"pre_intro.button__group": [
        {
            "url": "","name": "","img": ""
        }
    ],"content": {
        "introduction__rtf": "","investor-returns": {
            "intro__rtf": "","img__href": "","end__rtf": ""
        },"end__rtf": ""
    },"content.investor-returns.button__group": [
        {
            "url": "","content.button__group": [
        {
            "url": "","img": ""
        }
    ]
}

你可以看到我有 pre_intropre_intro.button__group 以及其他一些点符号的键。我如何分解它们,以便将它们合并到此对象中,以便输出

"pre_intro": {
  "content__rtf": "","button__group": [
    {  
      "url": "","img": ""
    }
  ]
},

我尝试使用 lodash 的 _.pickBy()获取包含 '.' 的所有键,然后尝试将它们缩减为一个对象,但无法使其正常工作。

_.pickBy(snippets,function(v,k) {
    return _.includes(k,".");
});

const ref = (obj,str) => {
    return str.split(".").reduce(function(o,x) { return o[x] },obj);
}

有什么帮助吗?我无法控制给我的原始对象。

解决方法

使用 flat from npm,然后这样做:

import { flatten,unflatten } from 'flat';

const v = { ...yourobject }

const merged = unflatten(flatten(v));

,

如果你不想使用任何外部库来帮助解决这个问题,这里有一个使用 vanilla Javascript 的算法:

1- 查找所有包含 . 的键。

2- 将密钥拆分为父项和子项

3- 为父键分配一个新的子键

4- 删除包含 .

的键

const object = {
  "sys": {
    "subject": "","preview_text": "","show_view_in_browser": true,"email_webview_url": "","rep_alert": true,"signatures": {
      "show_joshua": true,"show_warren": true,"show_david": true
    },"email_address": "","show_unsub_link": true,"unsubscribe_link": ""
  },"pre_intro": {
    "content__rtf": ""
  },"pre_intro.button__group": [{
    "url": "","name": "","img": ""
  }],"content": {
    "introduction__rtf": "","investor-returns": {
      "intro__rtf": "","img__href": "","end__rtf": ""
    },"end__rtf": ""
  },"content.investor-returns.button__group": [{
    "url": "","content.button__group": [{
    "url": "","img": ""
  }]
};

Object.keys(object).filter(key => key.indexOf(".") >= 0).forEach(key => {
  const combined = key.split(/\./);
  const parent = combined[0];
  const child = combined[1];
  if(!object[parent]) object[parent] = {}; // in case the key doesn't exist yet 

  object[parent][child] = object[key];  // assign the value.
  delete object[key];                   // remove the ugly key
});

console.log(object);

,

您可以在第一级键中构建一个新对象。

const
    convert = source => Object
        .entries(source)
        .reduce((r,[k,v]) => {
            const
                keys = k.split('.'),last = keys.pop();

            keys.reduce((o,k) => o[k] ??= {},r)[last] = v;
            return r;
        },{}),data = { sys: { subject: "",preview_text: "",show_view_in_browser: true,email_webview_url: "",rep_alert: true,signatures: { show_joshua: true,show_warren: true,show_david: true },email_address: "",show_unsub_link: true,unsubscribe_link: "" },pre_intro: { content__rtf: "" },"pre_intro.button__group": [{ url: "",name: "",img: "" }],content: { introduction__rtf: "","investor-returns": { intro__rtf: "",img__href: "",end__rtf: "" },"content.investor-returns.button__group": [{ url: "","content.button__group": [{ url: "",img: "" }] },result = convert(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?