javascript使用reduce方法构造新对象

时间:2018-05-15 07:28:03

标签: javascript ecmascript-6

你好,我坚持根据后端响应构建一个新对象。

以下是我收到的回复

| FIRSTNAME | UPPER(CONVERT(FIRSTNAME,'US7ASCII')) |
|-----------|--------------------------------------|
|       alo |                                  ALO |
|    Ângelo |                               ANGELO |
|       pal |                                  PAL |
|      Ying |                                 YING |
|     Yogen |                                YOGEN |
|      Yvet |                                 YVET |

要求是过滤响应以删除所有具有false值的属性,并构造一个包含访问控制值(acl)的新数组。预期的新对象将如下所示:

acl:[
     {
       "user_type":5,
       "user_id":"c7e5cb45ba764ad7ad29b5bdd4f12128",
       "user_name":"John",
       "view":true,
       "modify":false,
       "remove":false,
       "modify_acl":false
     },
     {
       "user_type":5,
       "user_id":"f673beac0245462f8c71066536049e72",
       "user_name":"Allan",
       "view":true,
       "modify":true,
       "remove":true,
       "modify_acl":false
     }]

目前我正在使用reduce方法删除所有错误值。但是我坚持要构建预期的结果。

1 个答案:

答案 0 :(得分:0)

您可以检查属性的类型,并使用布尔值来分配新的标签/值对并省略错误值。否则,取出键值对并将其分配给实际对象。

Array#map实际上是更好的选择方法,因为它返回一个需要的数组。

通过使用Array#reduce,累加器永远不会改变,因为它将是一个数组。

var acl = [{ user_type: 5, user_id: "c7e5cb45ba764ad7ad29b5bdd4f12128", user_name: "John", view: true, modify: false, remove: false, modify_acl: false }, { user_type: 5, user_id: "f673beac0245462f8c71066536049e72", user_name: "Allan", view: true, modify: true, remove: true, modify_acl: false }],
    result = acl.map(o => {
        var r = {},
            acl = [];

        Object.entries(o).forEach(([k, v]) => {
            if (typeof v === 'boolean') {
                v && acl.push({ value: k, label: v });
            } else {
                r[k] = v;
            }
        });
        return Object.assign(r, { acl });
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }