如何对比两个数组并返回相同索引位置共同元素组成的新数组
问题原因
Array#index方法的返回值是指定元素在数组中首次出现的索引,而非遍历过程中当前元素的实际索引。你提供的示例中,b数组末尾的2调用b.index(2)返回值为0,a数组调用a.index(2)返回值也为0,因此这个2也会被判定符合条件,最终返回结果为[2,2],和预期不符。- 现有代码逻辑是匹配两个数组中首次出现位置相同的元素,和需求「相同索引位置的共同元素」逻辑不一致。
正确实现
有两种常用的简洁实现方式:
方式1:使用each_with_index遍历索引
a = [2,3,1,1] b = [2,7,4,2] c = [] b.each_with_index do |item, idx| c << item if item == a[idx] end
方式2:使用zip+select组合写法
a = [2,3,1,1] b = [2,7,4,2] c = a.zip(b).select { |val_a, val_b| val_a == val_b }.map(&:first)
如果两个数组长度不一致,上述写法默认只会判断到较短数组的最大索引,若需要特殊处理长度不一致的场景,可以额外增加长度校验逻辑。
内容的提问来源于stack exchange,提问作者dedalus
相关产品推荐
相关产品推荐

