各サービスの名前とユーザーIDを使用してオブジェクトを作成しようとしていますが、オブジェクトは次のようになります。
const object = {
name: Netflix, user: (user id who pays max price for this provider)
name: Comcast, user: (same)
name: Verizon, user: (same)
}
マップリターンでオブジェクトプロパティを変更しようとしましたが、機能していません。また、オブジェクトはすでに半分完了しています。つまり、プロバイダーの名前を使用して、他のキーと値のペアが必要になります。
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}
]
そして、あなたの問題に対する3番目の可能な解決策として(私のコメントのフォローアップ)、次のようなものを使用できます(オブジェクトを変更できますが、好みに応じて変更できますがname
、user
キーを完全に削除することをお勧めします):
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 }
多くの場合、少し調整するだけで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 }]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加