如何在Javascript中从现有对象创建一个新对象?

8

正在开发JavaScript应用程序,需要帮助从ajax调用接收到的响应中创建一个新对象。

接收到的输出是对象数组,示例格式如下:

{
  "items": [
    {
      "id": "02egnc0eo7qk53e9nh7igq6d48",
      "summary": "Learn to swim",
      "start": {
        "dateTime": "2017-03-04T19:00:00+05:30"
      }
    }        

]
}

但我的组件期望以下格式的JavaScript对象:

{
id: "e1",
title: "Express",
start: "Jan 13, 2010",
description: "Jan 13, 2010"
}

以下方法是否正确,请提供更好的方法(如果有)

var content = {
    "items": [{
        "id": "02egnc0eo7qk53e9nh7igq6d48",
        "summary": "Learn to code",
        "start": {
          "dateTime": "2017-03-04T19:00:00+05:30"
        }
      }
      }
    };
    var gcalEvents = {};
    var jsonObj = {
      "id": "e1",
      "title": "Oracle Application Express",
      "start": "Jan 13, 2010",
      "description": "Jan 13, 2010"
    };

    console.log(content.items.length);
    for (var index = 0; index < content.items.length; index++) {
      var obj = content.items;
      console.log(obj);

      jsonObj.id = obj[index]["id"];
      jsonObj.title = obj[index].summary;
      jsonObj.start = obj[index].start.dateTime;
      jsonObj.description = "";
      console.log(jsonObj);
      gcalEvents[index] = jsonObj;
    }
    console.log(gcalEvents);


4
JSON是一种用于数据交换的文本符号。如果你正在处理JavaScript源代码,而不是处理字符串,那么你就不是在处理JSON。当你进行上述操作时,你只是在处理对象,而不是JSON。 - T.J. Crowder
您的输入是包含两个对象的数组。您展示的期望输出是一个单独的对象。您的意思是需要一个包含这些对象的数组吗? - T.J. Crowder
2
你如何定义标题?输出应该是什么?你如何定义id?你如何定义描述?所有对象都将是相同的吗? - Weedoze
哦,这个响应是对象数组,我需要提取数据并创建新的对象数组,然后再传递给我的组件。 - Rohit
基本上需要从对象中提取值,创建新的对象。 - Rohit
为什么不直接使用 jsonObj?为什么需要将它放在另一个对象中?它们是一样的... - Weedoze
5个回答

13

你可以采用以下更为函数式的方法:

var parsed = content.items.map(function (item) {
    return {
        id: item.id,
        title: item.summary,
        start: item.start.dateTime,
        description: item.start.dateTime
    }
})

这使用了数组属性中归属于map方法,通过循环遍历数组的每个项并返回一个新的解析对象数组。

请查看此完整示例


谢谢你,我忘了加上“return”,这让我很烦恼。一定不要漏掉它! - Jordan Grant

2

我有另一种方法来转换这个内容。 使用 Underscore.js 使代码更易读。 以下是一个示例:

var content = {
    "items": [{
        "id": "02egnc0eo7qk53e9nh7igq6d48",
        "summary": "Learn to code",
        "start": {
            "dateTime": "2017-03-04T19:00:00+05:30"
        }
    }, {
        "id": "nj4h567r617n4vd4kq98qfjrek",
        "summary": "Modern Data Architectures for Business Insights at Scale Confirmation",
        "start": {
            "dateTime": "2017-03-07T11:30:00+05:30"
        }
    }]
};
var result = _.map(content.items, function(item) {
    return {
        id: item.id,
        title: item.summary,
        start: item.start.dateTime,
        description: ""
    };
});
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

以下是结果:
[
  {
    "id": "02egnc0eo7qk53e9nh7igq6d48",
    "title": "Learn to code",
    "start": "2017-03-04T19:00:00+05:30",
    "description": ""
  },
  {
    "id": "nj4h567r617n4vd4kq98qfjrek",
    "title": "Modern Data Architectures for Business Insights at Scale Confirmation",
    "start": "2017-03-07T11:30:00+05:30",
    "description": ""
  }
]

2

核心是把一组数据映射到另一组数据。JavaScript的数组映射函数应该足够使用。例如:

var content = {
  "items": [{
    "id": "02egnc0eo7qk53e9nh7igq6d48",
    "summary": "Learn to code",
    "start": {
      "dateTime": "2017-03-04T19:00:00+05:30"
    }
  }]
};

var results = content.items.map(function (item) {
  return {
    id: item.id,
    title: item.summary,
    start: item.start.dateTime,
    description: ""
  };
});

console.log(results);

1
var jsonObj=[];
for (var index = 0; index < content.items.length; index++) {
  var obj = {};
  console.log(obj);
  obj["id"]=content.items[index].id;
  obj["title"]=content.items[index].summary;
  obj["start"]=content.items[index].start.dateTime;
  obj["description"]="";
  jsonObj.push(obj);
  console.log(jsonObj);
  //gcalEvents[index] = jsonObj;
}

这将为您提供所需的json对象jsonObj。
希望这可以帮助您 :)

0
这是已修复的代码: 一个错误是当您列出内容项时,末尾缺少“]”。 第二个错误是您试图将值分配给未定义的对象,您需要首先定义该对象,例如:jsonObj = {};然后再进行赋值操作。 我更喜欢在一次定义对象和赋值操作中完成。 为了将输出作为数组,您只需要将 collection 定义为数组而不是对象,例如:var gcalEvents = []

var content = {
  "items": [
    {
      "id": "02egnc0eo7qk53e9nh7igq6d48",
      "summary": "Learn to code",
      "start": {
        "dateTime": "2017-03-04T19:00:00+05:30"
      }
    },
    {
      "id": "nj4h567r617n4vd4kq98qfjrek",
      "summary": "Modern Data Architectures for Business Insights at Scale Confirmation",
      "start": {
        "dateTime": "2017-03-07T11:30:00+05:30"
      }
    }
  ]
};
              var gcalEvents = [];
                var jsonObj = {
                    "id": "e1",
                    "title": "Oracle Application Express",
                    "start": "Jan 13, 2010",
                    "description": "Jan 13, 2010"
                };
                
                //console.log(content.items.length);
                for(var index=0; index < content.items.length; index++){                    
                    var obj = content.items[index];
                    //console.log(obj);
                    
                    jsonObj = {
                      'id': obj["id"],
                      'title': obj.summary,
                      'start': obj.start.dateTime,
                      'description': ""   
                    }
                    //console.log(jsonObj);
                    gcalEvents[index] = jsonObj;
                }
                console.log(gcalEvents);


1
你也需要解释一下你修复了什么。此外,如果你想让它成为一个(至少看起来像)好的答案,还要修复缩进。 - dfsq
这也不会生成一个数组。OP在评论中说结果应该是一个数组。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接