如何在保留给定对象的所有属性的同时,浅表复制一个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,
}
答案 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);