【问题标题】:How to encapsulate object fields to be in array如何将对象字段封装在数组中
【发布时间】:2018-08-21 13:31:19
【问题描述】:

我有一个可以具有不同属性(数​​组/对象/等)的对象。

我想将对象转换为数组封装的每个子字段。

例如:

"head": {
            "text": "Main title",
            "sub": {
                "value": "next"
            },
            "place": "secondary"
        }

包含对象的头部字段。 我希望将对象封装在这样的数组中:

"head": [{
            "text": "Main title",
            "sub": {
                "value": "next"
            },
            "place": "secondary"
        }]

我发现这是保持每个项目的结构相同的可能性。

我也尝试过使用接口这样做,但它给我带来了麻烦,因为有时它是对象,有时不是,所以我想保留结构。

如果有更好的方法将对象转换为适当的界面,我想了解更多。

谢谢!

【问题讨论】:

  • 那么你想如何使用这些结构呢?能否提供一个使用示例谢谢
  • 无论你在做什么,再想想你想要达到的目标。整个操作看起来很不自然。
  • 无论如何,JSON 是一组 (key, value) 对,您遍历所有这些,如果 value 不是对象 - 您只需将其转换为 [value],当 value 是对象 - 递归重复。

标签: arrays json typescript


【解决方案1】:

这将递归检查每个值,如果不是,则将其设为数组。排除您放入 keysToSkip 数组的键。

const obj = {
  "head": {
    "text": "Main title",
    "sub": {
      "value": "next"
    },
    "place": "secondary"
  },
  "alreadyArray": [
    "val", "val2"
  ]
}

const keysToSkip = ["value"]

let depthFirstLoop = (obj) => {
  Object.keys(obj).forEach((key) => {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      depthFirstLoop(obj[key]);
    }
    if (!Array.isArray(obj[key]) && !keysToSkip.includes(key)) {
      obj[key] = [obj[key]]
    }
  });
};

depthFirstLoop(obj)

https://jsfiddle.net/9p7k64ec/26/

【讨论】:

  • 谢谢!但是如何为每个项目递归地做到这一点?
  • 您希望每个项目都在一个数组中?如果您给出对象的起始结构和结束结构,我很乐意帮助您提出一些建议。
  • 再次感谢,我怎样才能跳过已经是数组的级别键和我不想包装的其他类型?
  • 添加了两种方法。您可以随时添加更多跳过键的方法。
  • 用递归处理上述所有问题的新方法更新了答案。
【解决方案2】:

一般来说,您不应该在迭代对象时更改它。最好创建一个新对象。

const obj = {
  "head": {
    "text": "Main title",
    "sub": {
      "value": "next"
    },
    "place": "secondary"
  }
}
var newObj = {}

for( key in obj ){
    newObj[key] = [obj[key]]
}

【讨论】:

  • Object.keys 返回一个键数组。与 obj.forEach 不同
  • 不用担心。我知道那种感觉 =)
猜你喜欢
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2021-01-03
  • 2021-03-07
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多