我有一个类似于以下示例的对象数组。我想创建一个没有数据值的副本。
var fruits = ['Apple', 'Banana'];
var now = new Date();
var x = [{ 'fruits': fruits },
{ 'producer': 'farmer john', 'address': '123 old patch road', 'zip': 90291 },
27, 'hm',
{ 'asked': now }
]
现在假设有一些JavaScript函数,新的对象结构将被复制到以下内容中:
var theStructure = [{ 'fruits': ['',''] },
{ 'producer': '', 'address': '', 'zip': NaN },
NaN, '',
{'asked': NaN }]
我已经阅读了How to copy an object's structure (but not the data) 上的帖子,但看不到如何使其适用于我的情况。也许解决方案是长时间分析原始对象并使用case语句来处理每种数据类型。
如果有一种简单的方法可以提供解决方案,我的应用程序将在AngularJS中使用。
答案 0 :(得分:3)
这实际上只是递归的问题,直到您最终遇到想要抹去的对象或值。在您的示例中,您需要区分数字,日期和字符串。这有点棘手,因为new Date
返回一个对象,但是您希望它成为NaN
。
尽管如此,也许这足以开始使用:
var fruits = ['Apple', 'Banana'];
var now = new Date();
var x = [{ 'fruits': fruits }, { 'producer': 'farmer john', 'address': '123 old patch road', 'zip': 90291 }, 27, 'hm', { 'asked': now }]
function stripValues(obj){
if(Array.isArray(obj)) return obj.map(stripValues)
if (typeof obj == 'object') {
return (obj instanceof Date)
? NaN
: Object.entries(obj).reduce((newObj, [key, value]) => {
newObj[key] = stripValues(value)
return newObj
}, {})
}
return isNaN(obj) ? '' : NaN
}
console.log(stripValues(x))
答案 1 :(得分:0)
此代码对我有用。
var fruits = ["Apple", "Banana"];
var now = new Date();
var x = [
{ fruits: fruits },
{ producer: "farmer john", address: "123 old patch road", zip: 90291 },
27,
"hm",
{ asked: now }
];
// var theStructure = [
// { fruits: ["", ""] },
// { producer: "", address: "", zip: NaN },
// NaN,
// "",
// { asked: NaN }
// ];
function makeStructureRecursively(obj) {
let arr;
arr = obj instanceof Array;
if (arr) return mapArrayElements(obj);
arr = obj instanceof Date;
if(arr) return NaN;
arr = obj instanceof Object;
if (arr) return mapObjectValues(obj);
if (typeof obj === "number") return NaN;
if (typeof obj === "string") return "";
return undefined;
}
function mapArrayElements(arr) {
return arr.map(el => makeStructureRecursively(el));
}
function mapObjectValues(obj) {
return Object.keys(obj).map(key => ({
[key]: makeStructureRecursively(obj[key])
})).reduce((a,b)=>({...a,...b}),{});
}
var theStructure = makeStructureRecursively(x);
当然,随着复杂度的增加,您必须修改此代码。例如,我没有处理boolean, symbol, undefined
等。