루비에서 인덱스로 매핑하는 방법?


답변:


835

루비 1.8.7 또는 1.9를 사용하는 each_with_index경우 블록없이 호출하면 Enumerator객체 Enumerable와 같은 메소드 를 호출 할 수있는 반복자 메소드 를 사용할 수 있습니다 map. 그래서 당신은 할 수 있습니다 :

arr.each_with_index.map { |x,i| [x, i+2] }

1.8.6에서는 다음을 수행 할 수 있습니다.

require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }

감사! 의 문서에 대한 포인터를 제공해 주 .each_with_index.map시겠습니까?
Misha Moroshko

1
@Misha : 언제나처럼 map방법입니다 Enumerable. each_with_index, 블록없이 호출 되면 , Enumerator믹싱 되는 객체 (1.8.7+)를 반환 Enumerable하므로 배열, 해시, 범위 등에서처럼 , 등을 호출 할 수 있습니다 .mapselectreject
sepp2k

9
IMO 이것은 1.8.7+에서 더 단순하고 잘 읽습니다 :arr.map.with_index{ |o,i| [o,i+2] }
Phrogz

4
@Phrogz : map.with_index1.8.7에서 작동하지 않습니다 ( map1.8에서 블록없이 호출되면 배열을 반환합니다).
sepp2k

2
.map에서는 작동하지 않습니다. 루핑하는 배열에 직접 영향을 미치려면
Ash Blue


130

루비 1.9.3에는 체인 가능한 메소드가 있습니다. with_index 체인으로 연결될 수있는 체인 가능한 가 있습니다.

예를 들면 다음과 같습니다.

array.map.with_index { |item, index| ... }

17

상단 난독 화 :

arr = ('a'..'g').to_a
indexes = arr.each_index.map(&2.method(:+))
arr.zip(indexes)

12
앤드류는 훌륭한 직업 안전을 지녀야합니다! :)
David J.

9

열거자를 사용하지 않고 1.8.6 (또는 1.9)에 대한 두 가지 추가 옵션이 있습니다.

# Fun with functional
arr = ('a'..'g').to_a
arr.zip( (2..(arr.length+2)).to_a )
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]

# The simplest
n = 1
arr.map{ |c| [c, n+=1 ] }
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]


4

이것을하는 재미 있지만 쓸모없는 방법 :

az  = ('a'..'z').to_a
azz = az.map{|e| [e, az.index(e)+2]}

왜 싫어? 이 작업을 수행하는 기능적인 방법이며 결과를 얻는 것은 어리석은 방법이라고 말합니다.
Automatico

#index 호출은 이제 이것이 O (N ^ 2) 루프임을 의미합니다. 왜 +2? :)
rogerdpack

2
내가 쓴대로 A fun, but useless way. +2OP가 요구하는 결과를 만드는 것입니다
Automatico


1
module Enumerable
  def map_with_index(&block)
    i = 0
    self.map { |val|
      val = block.call(val, i)
      i += 1
      val
    }
  end
end

["foo", "bar"].map_with_index {|item, index| [item, index] } => [["foo", 0], ["bar", 1]]

3
세상에! 다른 답변도 읽었습니까? map.with_index루비에 이미 존재합니다. 열거 가능한 클래스를 다시 열고 이미 존재하는 것을 추가하는 것이 좋습니다.
nathanvda

이것은 이상한 것들 each_with_index.map등 을 사용하는 대신 1.8.6 및 1.8.7 (우리 중 일부는 여전히 그것을 사용합니다)하는 것이 더 쉬운 방법 일 수 있으며 최신 버전의 사람들도 사용하는 것을 선호 할 수 있습니다 map.with_index FWIW :)
rogerdpack

1

나는 종종 이것을한다 :

arr = ["a", "b", "c"]

(0...arr.length).map do |int|
  [arr[int], int + 2]
end

#=> [["a", 2], ["b", 3], ["c", 4]]

배열의 요소를 직접 반복하는 대신 정수 범위를 반복하여 배열의 요소를 검색하는 인덱스로 사용합니다.


1
다른 답변을 읽으면 더 나은 접근 방식이 있음을 깨닫기를 바랍니다. 따라서 왜 이것을 추가해야했는지 확실하지 않습니다.
nathanvda

Andrew Grimm의 답변이 10 표를 받아야한다면이 투표는 1 표 이상이어야합니다!
Camille Goudeseune
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.