没有引用的浅表JavaScript对象

时间:2019-09-04 11:35:43

标签: javascript

如何在保留给定对象的所有属性的同时,浅表复制一个JavaScript对象并除去所有非原始值(所有引用)。在此过程中,属性的值可能会变成null

Object.assign,破折号clone和散布运算符使我们能够获取对象的浅表副本。但是,尽管命名,结果对象也不浅[事实]。它也已经复制了所有引用,因此整个对象树仍然可以访问。

对于分析解决方案,我需要摆脱比一个层次更深的内容。

我如何做到这一点(库也可以,ES6很好)而无需编写许多规则来处理所有可能的数据类型?理想情况下,对象和数组属性不会丢失,而是替换为某些内容,例如空或空的对象/数组。

示例

const source = {
    nr: 1,
    str: 'ok',
    obj: {
        uhOh: 'kill me'
    },
    arr: ['well ok', { uhOh: 'uhOh' }],
}

// apply voodoo 

const expected = {
    nr: 1,
    str: 'ok',
    obj: {},
    arr: [],
}

// This would also be an valid result:
const expected = {
    nr: 1,
    str: 'ok',
    obj: null,
    arr: null,
}

2 个答案:

答案 0 :(得分:1)

您可以使用for...in遍历对象的键。如果值是对象,则在expected中将键设置为null,否则将expected中的值设置为source

中的值

const source = {
  nr: 1,
  str: 'ok',
  obj: {
    uhOh: 'kill me'
  },
  arr: ['well ok', {
    uhOh: 'uhOh'
  }],
}

const expected = {};

for (const key in source) {
  if (typeof source[key] === 'object')
    expected[key] = null
  else
    expected[key] = source[key]
}

console.log(expected)

答案 1 :(得分:0)

这本身并不是一个答案,而是@adiga 出色答案的补充,这次使用的是 typescript 和一个类型参数:

private primitiveClone<T>(source: T): T {
    const dto = Object.assign({}, source);
    for (const key in dto) {
        if (typeof dto[key] === 'object') {
            dto[key] = null;
        }
    }
    return dto;
}

使用

var simpleClone = primitiveClone(data);
相关问题