JavaScript复制对象结构(不是属性值)

JavaScript复制对象结构(不是属性值),javascript,angularjs,json,Javascript,Angularjs,Json,我有一个对象数组,看起来像下面的例子。我想创建一个没有数据值的副本 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 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 }]
我已经在上阅读了帖子,但不知道如何使其适用于我的情况。也许解决方案是使用case语句对原始对象进行长时间解析,以处理每种数据类型


我的应用程序是AngularJS,以防有一种简单的方法来提供解决方案。

这实际上只是一个递归问题,直到你最终得到一种想要删除的对象或值。在您的示例中,您需要区分数字、日期和字符串。这有点棘手,因为
newdate
返回一个对象,但您希望它变成
NaN

然而,也许这就足够开始了:

var-fruits=['苹果','香蕉'];
var now=新日期();
var x=[{'fruits':fruits},{'producer':'farmer john','address':'123 old patch road','zip':90291},27'hm',{'asked':now}]
函数条带值(obj){
if(Array.isArray(obj))返回obj.map(stripValues)
如果(对象类型=='object'){
返回(obj实例截止日期)
?南
:Object.entries(obj).reduce((newObj[key,value])=>{
newObj[key]=stripValues(值)
返回newObj
}, {})
}
返回isNaN(obj)?“”:NaN
}

log(stripValues(x))
这实际上只是一个递归的问题,直到您最终得到一种想要删除的对象或值。在您的示例中,您需要区分数字、日期和字符串。这有点棘手,因为
newdate
返回一个对象,但您希望它变成
NaN

然而,也许这就足够开始了:

var-fruits=['苹果','香蕉'];
var now=新日期();
var x=[{'fruits':fruits},{'producer':'farmer john','address':'123 old patch road','zip':90291},27'hm',{'asked':now}]
函数条带值(obj){
if(Array.isArray(obj))返回obj.map(stripValues)
如果(对象类型=='object'){
返回(obj实例截止日期)
?南
:Object.entries(obj).reduce((newObj[key,value])=>{
newObj[key]=stripValues(值)
返回newObj
}, {})
}
返回isNaN(obj)?“”:NaN
}

log(stripValues(x))
这段代码适合我

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);

当然,随着复杂性的增加,您必须修改此代码。例如,我没有处理布尔、符号、未定义等。

这段代码适合我

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);

当然,随着复杂性的增加,您必须修改此代码。例如,我没有处理过
布尔、符号、未定义的
等等。

也许lodash#cloneDeepWith可以帮你解决这个问题。我在尝试提出一个递归函数来完成这项工作时面临的问题是,javascript将数组和对象视为对象,但在您想要的解决方案中,如果是一个数组,您不想显示键(
0,1,2等
),但如果是一个对象,您想要它们(
{fruits:'},等
)。编辑:使用
instanceof
看看我是否能想出一个解决方案。也许lodash#cloneDeepWith可以帮你解决这个问题。我在尝试提出一个递归函数来完成这项工作时面临的问题是,javascript将数组和对象视为对象,但在您想要的解决方案中,如果是一个数组,您不想显示键(
0,1,2等
),但如果是一个对象,您想要它们(
{fruits:'},等
)。编辑:使用
instanceof
,看看我是否能想出一个解决方案。对于指定的用例,我想出了一个解决方案。添加到下面,让我知道如果你看到任何错误。这是非常聪明,似乎工作。我仍然在思考如何完美地循环所有嵌套属性。我理解@HarveyMushman-我经常发现递归函数有点令人费解。对于指定的用例,我想出了一个解决方案。添加到下面,让我知道如果你看到任何错误。这是非常聪明,似乎工作。我仍然在思考如何完美地循环所有嵌套属性。我理解@HarveyMushman-我经常发现递归函数有点令人费解。