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

时间:2018-11-28 16:24:40

标签: 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 }
        ]

现在假设有一些JavaScript函数,新的对象结构将被复制到以下内容中:

var theStructure = [{ 'fruits': ['',''] },
                    { 'producer': '', 'address': '', 'zip': NaN },
                    NaN, '', 
                    {'asked': NaN }]

我已经阅读了How to copy an object's structure (but not the data) 上的帖子,但看不到如何使其适用于我的情况。也许解决方案是长时间分析原始对象并使用case语句来处理每种数据类型。

如果有一种简单的方法可以提供解决方案,我的应用程序将在AngularJS中使用。

2 个答案:

答案 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等。