嘿,
我一直在绞尽脑汁做一个JS算法练习,其中我有两个数组:一个有性别,一个有数字决定他们的年龄。我需要比较两者,并确定有多少是一个性别超过一定的年龄,有多少是相反的性别在一定的年龄。什么是最好的方式来实现它?数组总是有相同的长度。
示例数组为:
gender = ["man","woman","man","man","woman"]
age = [30,20,13,63,9]
我使用了各种for
循环来确定有多少是男性和女性,以及18岁以上和18岁以下。
for循环是这样的:
for(let i = 0; i < age.length; i++) {
if(age[i] >= 18) {
adults ++
} else {
minors ++
}
}
其中adults
和minors
的初始值为0
我正在考虑是否应该将它们转换为数组,并在稍后返回数组的长度,因为我必须返回一个数量而不是一个列表。
5条答案
按热度按时间uyhoqukh1#
你可以用Array.reduce实现一种数组压缩,以获得更方便的结构,然后根据需要过滤对象并获得结果的长度:
ryoqjall2#
仅仅计算
adults
和minors
是不够的。你可能需要adultMen
adultWomen
,minorMen
和minorWomen
。你需要比较年龄和性别。omqzjyyz3#
这是一个O(n)的解决方案,使用对象作为数据结构:
试试看:
更简洁的版本(
0
用于年轻人,1
用于同等人,2
用于老年人):...或者,如果您喜欢
-1
/0
/1
:h6my8fg24#
nnsrf1az5#
我认为我们可以通过抽象一点来使它更强大,更有用。我们有一些与属性名称(“gender”,“age”)相关联的值列表。这些列表具有相同的长度。我们希望查询这些列表的 * 组合 *。
因此,我们可以编写一个泛型
combine
,它接受像{gender: ['man', 'woman', 'man', 'man', 'woman'], age: [30, 20, 13, 63, 9]}
这样的输入,并返回一个函数集合,这里只有query
和count
,但我们可以想象其他函数。然后,我们向其中任何一个传递一个 predicate 函数,并获得匹配结果或其计数。
这是这个想法的一个实现:
这并不局限于两个属性,如果我们将
eyes: ['blue', 'brown', 'brown', 'hazel', 'blue']
添加到输入中,那么我们正在研究的对象也将具有eyes
属性。有一个重要的警告:提供的属性数组必须具有相同的长度。2当然,这是问题陈述中固有的,但它真正的意思是这种技术相当有限。