【问题标题】:Return value from map is undefined地图的返回值未定义
【发布时间】:2018-06-26 11:57:14
【问题描述】:

我的数据看起来像这样:

[ 
  {  ItemID: 1,  Path: '/Admin',     Name: 'Admin'   },
  {  ItemID: 2,  Path: '/Product',   Name: 'Product' },
  {  ItemID: 3,  Path: '/Reports',   Name: 'Reports' } 
]

问题是我无法让它返回正确的结果。它目前返回undefined。 我有一种感觉,这可能与范围或函数的调用方式有关。

这是我目前所拥有的:

const result = data
    .map(curr => {

        // Map over the object and check the names of the object
        // create a new key `groupName` if matched

        if (curr.Name == "Admin") {
            let groupName = "Admin Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Product") {
            let groupName = "Product Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Reports") {
            let groupName = "Reports";
            return { ...curr, groupName: groupName };
        }
    })
    .map(obj => {
// obj now looks like this
//{ ItemID: 1, Path: '/Admin',  Name: 'Admin',   groupName: 'Admin Access' }
//{ ItemID: 2, Path: '/Product',Name: 'Product', groupName: 'Product Access'}
//{ ItemID: 3, Path: '/Reports',Name: 'Reports', groupName: 'Reports' }

        // Map over the object and check permissions for access

        let enabled = checkInGroup(username, obj.groupName)
        .then(function(isMember) {
            if (isMember) {
                return obj; //isMember will return true or false
            }
        });
        return obj == enabled; //if enabled then add to return object
    });

console.log("===> result ", result);

预期的结果是:(假设用户无法访问管理员)

[ 
  {  ItemID: 2,  Path: '/Product',   Name: 'Product' },
  {  ItemID: 1,  Path: '/Reports',   Name: 'Reports' } 
]

编辑:添加 CheckInGroup 功能

function checkInGroup(username, groupName) {
    return new Promise(function(resolve, reject) {
        ad.isUserMemberOf(username, groupName, function(err, isMember) {
            if (err) {
                return res.json("Error ", err);
            }
            resolve(isMember);
        });
    });
}

【问题讨论】:

  • 尝试替换返回值:{groupName: groupName, ...curr },展开运算符必须是最后一个。另外,如果您可以发布您的checkInGroupfunction..
  • @Tico 第一张地图似乎工作正常,因为它返回 groupName 没有问题。这似乎是我无法返回任何值的第二张地图
  • .then() 总是返回一个承诺,所以obj === enabled 将不起作用。您不能使异步代码同步。
  • @FelixKling hmm 有没有一种方法可以重新编写它可以让它工作?
  • 您应该在逻辑的第二部分使用filter() 而不是映射

标签: javascript function ecmascript-6


【解决方案1】:

.then() 总是返回一个承诺,所以obj === enabled 将不起作用。您不能使异步代码同步。一旦你有了一个异步函数,链上的每个调用者都需要能够处理它。

你可以得到一个promise列表,等到所有promise都解决了,然后过滤掉那些无效的:

const promises = data
    .map(curr => {

        // Map over the object and check the names of the object
        // create a new key `groupName` if matched

        if (curr.Name == "Admin") {
            let groupName = "Admin Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Product") {
            let groupName = "Product Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Reports") {
            let groupName = "Reports";
            return { ...curr, groupName: groupName };
        }
    })
    .map(obj => {
        // Map over the object and check permissions for access
        return checkInGroup(username, obj.groupName)
        .then(function(isMember) {
            obj.enabled = isMember;
            return obj;
        });
    });

Promise.all(promises).then(result => {
  console.log(result.filter(obj => obj.enabled));
});

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2013-12-31
    • 2021-09-22
    • 1970-01-01
    • 2021-07-02
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多