如何将对象字段封装在数组中

时间:2018-08-21 13:31:19

标签: arrays json typescript

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

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

例如:

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

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

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

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

我也尝试使用接口,但是由于有时它是对象而有时不是对象,所以这给我带来了麻烦。

如果有更好的方法将对象转换为正确的接口,我想听听更多。

谢谢!

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

通常,您不应在迭代对象时更改对象。最好创建一个新对象。

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

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