我正在尝试使用每个服务的名称和用户ID创建一个对象,我希望该对象看起来像这样:

const object = {
    name: Netflix, user: (user id who pays max price for this provider)
    name: Comcast, user: (same)
    name: Verizon, user: (same)
}

我已经尝试过更改 map 返回中的object属性,但是它不起作用,而且我已经完成了一半对象,我的意思是使用提供程序的名称,现在我需要另一个键,值对
const services = [
     { userid: 1, providerId: 1, amount: 250000 },
     { userid: 4, providerId: 3, amount: 280900 },
     { userid: 6, providerId: 3, amount: 31000 },
     { userid: 2, providerId: 2, amount: 58600 },
     { userid: 3, providerId: 1, amount: 13000 },
     { userid: 5, providerId: 2, amount: 5000 },
     { userid: 3, providerId: 3, amount: 59900 },
     { userid: 6, providerId: 3, amount: 9500 }
]

const providers = [
    { id: 1, name: Netflix },
    { id: 2, name: Comcast },
    { id: 3, name: Verizon }
]

这是我的职责
function getUserId(providerId) {
    return services.filter(function(obj) {
        if (obj.providerId == providerId)
            return obj.providerId;
    }).map(function(obj) { return obj.amount });
}

function getMaxUserId(providerId) {
    return Math.max(...getUserId(providerId));
}

providers.forEach(prov => {
    object[prov.name] = getUserId(prov.id);
})

如您所见,首先我过滤整个数组以查找具有特定providerId的提供者,然后创建一个带有map函数的新数组,其中填充了该特定提供者的所有“金额”,最后我搜索该数组的最大数量,一切正常,它会为每个提供商返回正确的最大金额,但我也想获取为每个提供商支付最多的用户ID

实际上,我得到的对象是这样的:
[
   {name: Netflix, user: 250000},
   {name: Comcast, user: 58600},
   {name: Verizon, user: 280900}
]

我需要这个:
[
   {name: Netflix, user: 1},
   {name: Comcast, user: 2},
   {name: Verizon, user: 4}
]

最佳答案

并且,作为解决问题的第三种方法(按照我的评论),可以使用类似的方法(可以修改对象,但是可以根据自己的喜好进行修改,但是我建议您完全摆脱nameuser键):

const object = {};

function getUserId(providerId) {
    return services.filter(function(obj) {
        if (obj.providerId == providerId)
            return obj.providerId;
    }).map(function(obj) { return obj });
}

function getMaxUserId(output) {
    let amm = output.map( (o) => { return o.amount; } );
    let idx = amm.indexOf(Math.max(...amm));
    return output[idx].userid;
}

providers.forEach(prov => {
    object[prov.name] = getMaxUserId(getUserId(prov.id));
})

console.log(object)

您使用此解决方案的情况下的输出将如下所示:
Object { Netflix: 1, Comcast: 2, Verizon: 4 }

Ofc,只需稍作调整,就可以返回带有原始对象的Array(别忘了将object分配给[]):
providers.forEach(prov => {
  object.push( {name:prov.name,user:getMaxUserId(getUserId(prov.id))} )
})

在后一种情况下,输出将如下所示:
Array [Object { name: "Netflix", user: 1 }, Object { name: "Comcast", user: 2 }, Object { name: "Verizon", user: 4 }]

10-06 04:34