循环遍历数组并将单独的对象添加到新数组中-新数组中只有一个项

loop over array and add separate objects to new array - only one item in new array

本文关键字:数组 新数组 有一个 遍历 单独 添加 对象 循环      更新时间:2023-09-26

我正在调用返回JSON响应的后端API。我在这里读了很多答案,包括这个,但他们似乎没有涵盖我的问题。

来自API的JSON响应如下所示:
[
    {
        "id": "1", 
        "name": "test1",
    },
    {
        "id": "2",
        "name": "test2",
    }
]
我的Angular JS代码是这样的:
controller.testDetailHolder = [];
Test.getAllTests.query({}, function(data){
            for(var i=0; i<data.length;i++){
                controller.testDetailHolder.name = data[i].name;
                controller.testDetailHolder.id = data[i].id;
            }   
        });

当I console.log控制器。testDetailHolder它只显示第二个值从GET请求(即数组只持有一个值)然而,我想要的控制器。testDetailHolder看起来像这样:

controller.testDetailHolder = [
    {
        id: "1", 
        name: "test1",
    },
    {
        id: "2",
        name: "test2",
    }
]

如果有任何帮助,我将不胜感激。

谢谢。

controller.testDetailHolder = [];
Test.getAllTests.query({}, function(data){
            for(var i=0; i<data.length;i++){
                controller.testDetailHolder.push({
                    name : data[i].hours,
                    id   : data[i].id
                });
            }   
        });

您的循环不断覆盖controller.testDetailHolder,因此您需要使用数组语法:

Test.getAllTests.query({}, function(data){
            for(var i=0; i<data.length;i++){
                controller.testDetailHolder[i].name = data[i].hours;
                                           ^^^ 
                controller.testDetailHolder[i].id = data[i].id;
            }   
        });

您可以这样分配数据:

Test.getAllTests.query({}, function(data){
  controller.testDetailHolder = data;
});

或者使用push将其添加到现有数组中:

Test.getAllTests.query({}, function(data){
  Array.prototype.push.apply(controller.testDetailHolder, data);
});

controller.testDetailHolder是数组本身,而不是数组中的元素。您希望将这些值添加为元素,这些元素由controller.testDetailHolder[i]访问,其中i是元素的索引。将代码修改为:

controller.testDetailHolder[i].name = data[i].hours;
controller.testDetailHolder[i].id = data[i].id;

问题是您完全覆盖了完整的testDetailHolder数组,因为您在设置值时没有指定索引。

controller.testDetailHolder.name应该是controller.testDetailHolder[i].name


另一个问题是,当hours没有在JSON上定义时,您正在使用data[i].hours


最后,因为你想复制整个对象你可以只做一个赋值

Test.getAllTests.query({}, function(data){
        controller.testDetailHolder = data;  
    });