【问题标题】:Comparing two objects to get percentage比较两个对象以获得百分比
【发布时间】:2018-04-18 01:40:17
【问题描述】:

我想知道是否有办法使用 array.map() 来做到这一点

我有两个位置列表(WOL、SYD、MEL 等),其中一个包含每个位置中所有设备为子设备的站点总数,另一个仅包含有错误的设备。

我需要找出每个站点出错的设备占每个站点的设备总数的百分比。

有没有办法使用 uniqueSitesCount.map(...) 来做到这一点?我整个周末都在查看文档,并试图在问这里之前弄清楚,但到目前为止都失败了。

uniqueSitesCountNotOk - 位置数组,仅将出错的设备添加到“设备”子数组中:

[ { site: 'CBR',
    devices: [ [Object], [Object], [Object], [Object], [Object], [Object] ] },
  { site: 'MEL',
    devices: [ [Object], [Object], [Object], [Object], [Object] ] },
  { site: 'SYD', devices: [] },
  { site: 'WOL', devices: [] } ]

uniqueSitesCount - 包含所有对象的位置数组

[ { site: 'CBR',
    devices: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ] },
  { site: 'MEL',
    devices: [ [Object], [Object], [Object], [Object], [Object] ] },
  { site: 'SYD', devices: [ [Object], [Object], [Object], [Object], [Object] ] },
  { site: 'WOL', devices: [ [Object], [Object], [Object], [Object], [Object] ] } ]

功能:

为了清楚起见,编辑:uniqueSitesCount[i].countuniqueSitesCount[i].devices.length

var getSiteErrorPercentage = function(uniqueSitesCount, uniqueSitesCountNotOk) {
    for (var i = 0; i < uniqueSitesCount.length; i++) {
        if (uniqueSitesCountNotOk[i].devices.length > 0) {
            console.log(`${uniqueSitesCount[i].site} - ${(uniqueSitesCountNotOk[i].devices.length / uniqueSitesCount[i].devices.length* 100).toFixed(2)}%`)
        } else {
            console.log(uniqueSitesCount[i].site + ' - 0%')
        }
    }
}

【问题讨论】:

  • 好吧map 用于映射,IOW:它会返回一些东西,你的代码不会返回任何东西,而只是控制台日志。相反,您可能会想到forEach。答案是肯定的。
  • 有使用地图的理由吗?似乎在回调中使用带有 find 的过滤器会更容易。虽然很难帮助 [object] 摆脱 tbh。
  • 您只需要计算设备数组中的对象数量,还是每个对象都有您需要计算的数量?
  • @Keith,它将返回百分比,目前只是在测试时使用 Console.Log()
  • @DLowther - 我不只是过滤。我已经有一个数组被过滤为只有错误的设备。我想要做的是显示错误设备与总设备的百分比

标签: javascript arrays node.js ecmascript-6


【解决方案1】:

我会考虑快速循环遍历uniqueSitesCount 以创建一个直接将站点映射到对象计数的对象。比如:

var uniqueSitesCount = [ 
    { site: 'CBR', devices: [[],[],[],[],[],[],[],[],[],[],[] ] },
    { site: 'MEL', devices: [[],[],[],[],[] ] },
    { site: 'SYD', devices: [[],[],[],[],[] ] },
    { site: 'WOL', devices: [[],[],[],[],[] ] } 
]

var counts =  uniqueSitesCount.reduce((acc, cur) => {
    acc[cur.site] = cur.devices.length
    return acc
}, {})

计数如下:

{ CBR: 11, MEL: 5, SYD: 5, WOL: 5 }

这样你就可以映射你的错误并创建一个具有百分比的数组,例如:

var uniqueSitesCount = [ 
    { site: 'CBR', devices: [[],[],[],[],[],[],[],[],[],[],[] ] },
    { site: 'MEL', devices: [[],[],[],[],[] ] },
    { site: 'SYD', devices: [[],[],[],[],[] ] },
    { site: 'WOL', devices: [[],[],[],[],[] ] } 
]

var uniqueSitesCountNotOk = [ 
    { site: 'CBR', devices: [ [], [], [], [], [], [] ] },
    { site: 'MEL', devices: [ [], [], [], [], [] ] },
    { site: 'SYD', devices: [] },
    { site: 'WOL', devices: [] } 
]

var counts =  uniqueSitesCount.reduce((acc, cur) => {
    acc[cur.site] = cur.devices.length
    return acc
}, {})

var percents = uniqueSitesCountNotOk.map(item => {
    var n = item.devices.length / counts[item.site] * 100
    return {site:item.site, count: n}
})

console.log(percents)

或者,您可以避免使用 count 对象,但每次都必须搜索 uniqueSitesCount 对象:

var percents = uniqueSitesCountNotOk.map(item => {
   var site = uniqueSitesCount.find(i => i.site === item.site )
   var n = item.devices.length / site.devices.length * 100
   return {site:item.site, count: n}
})

【讨论】:

  • 谢谢,非常感谢 :) 对 JS 的功能方面和较新的 ES2015 语法仍然很陌生,所以我现在试着了解 map、reduce 和 filter。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多