【问题标题】:Javascript loop + Object Issue: How to get required item in object with loopJavascript循环+对象问题:如何使用循环获取对象中的必需项
【发布时间】:2012-05-08 09:23:17
【问题描述】:

我在循环、对象方面遇到了一些问题

我有这样的json;

var jsonPermission = {"permissions": [
                            {"permissionId": 1, "permissionName": "Admin Permission", "roleDesc": "This is an Admin Permission"},
                            {"permissionId": 2, "permissionName": "Manager Permission", "roleDesc": "This is a Manager Permission"},
                            {"permissionId": 3, "permissionName": "User Permission", "roleDesc": "This is a user Permission"}
                        ]
                    };

我必须制作这样的对象;

[
    { data: "Admin Permission",        type: ["permission"] },
    { data: "Manager Permission",        type: ["permission"] },
    { data: "User Permission",      type: ["permission"] }
]

所以我使用了以下代码;

//For Permissions
var permissions_len = jsonPermission.permissions.length;
var arr_permissions = [];
var permission_type = ["permission"];
for(var i=0;i<permissions_len;i++){
    var obj_permissions = {};
    obj_permissions["data"] = jsonPermission.permissions[i].permissionName;
    obj_permissions["type"] = permission_type;
    arr_permissions.push(obj_permissions);
}

但是我却变成了这样:

[
    { data: "Admin Permission",        type: [1] },
    { data: "Manager Permission",        type: [1] },
    { data: "User Permission",      type: [1] }
]

如何执行?

【问题讨论】:

  • 就像一个注释,因为我无法在您的代码中发现一个明显的错误:您正在为所有 type-definitions 分配相同的数组对象。因此,如果您更改此数组,例如,通过附加一个元素,此更改将影响 all type 属性。我认为为每个条目创建一个单独的数组会更好。

标签: javascript object for-loop


【解决方案1】:

我认为这是您用来评估结果的工具的问题,如果您使用 firefox console.log() 将结果记录到控制台,它会给您显示的结果。但是,如果您在代码中使用 for 循环正确检查该值,您会发现这些值是正确的。

检查如下所示的值

var permissions_len = jsonPermission.permissions.length;
var arr_permissions = [];
var permission_type = ["permission"];
for(var i=0;i<permissions_len;i++){
    var obj_permissions = {};
    obj_permissions["data"] = jsonPermission.permissions[i].permissionName;
    obj_permissions["type"] = permission_type;
    arr_permissions.push(obj_permissions);
}

for(var i=0;i<permissions_len;i++){
    var a = arr_permissions[i];
    console.log(a.data, a.type)
}

你可以测试一下here

【讨论】:

  • 谢谢。您对 Firefox 控制台的看法是正确的。您的解决方案显示了准确的值。
【解决方案2】:

怎么样:

obj_permissions["type"] = [ permission_type[0] ];

代替:

obj_permissions["type"] = permission_type;

看到区别了吗?您正在使用数组。

[编辑:实际上没有太大区别,但这仍然澄清了。见 cmets。]

【讨论】:

  • 我按照您的建议使用了,但问题仍然完全相同。
  • 嗯...我对此感到有些困惑。如果我这样做var ray = ["okay"];var obj = { "x" = [ray[0]] }; console.log(obj),我会得到{ x: [ 'okay' ] }。老实说,我对您的版本也有同样的看法……也许您的问题出在其他地方? [啊:显然是这样——Firefox 控制台;我用node 命令行解释器测试过,你应该得到一个;)]
【解决方案3】:

由于permission_type 是一个数组字面量,最终数组项的type 属性最终是一个元素的数组。如果您不打算这样做,请删除数组表示法。

例如:

var source = jsonPermission.permissions;
var arr_permissions = [];
for(var i=0;i<source.length;i++){
    arr_permissions.push({
        data: source[i].permissionName,
        type: ["permission"] // or type: "permission" if you didn't want an array
    });
}

这个版本的代码稍微简化了一点,但也有一个非常重要的区别:每个项目的type 不再是同一个对象,所以你不能一次全部更改(无论是有意还是无意,都有出乎意料的坏习惯)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多