ES6 tương đương với 'liệt kê' của Python cho một chuỗi là gì?


97

Python có một hàm tích hợpenumerate , để lấy một (index, item)cặp có thể lặp lại .

ES6 có tương đương cho một mảng không? Nó là gì?

def elements_with_index(elements):
    modified_elements = []
    for i, element in enumerate(elements):
         modified_elements.append("%d:%s" % (i, element))
    return modified_elements

print(elements_with_index(["a","b"]))
#['0:a', '1:b']

ES6 tương đương mà không có enumerate:

function elements_with_index(elements){
     return elements.map(element => elements.indexOf(element) + ':' + element);
 }

console.log(elements_with_index(['a','b']))
//[ '0:a', '1:b' ]

nhưng map hoặc forEach đã làm được điều này rồi, có thể lấy cả phần tử và chỉ mục
juvian

Như @juvian nói, tại sao không chỉ sử dụng chỉ mục có sẵn trong bản đồ? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice

@JamesAllardice với doc từ mozilla: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Câu trả lời:


105

Có đó, kiểm tra Array.prototype.entries().

const foobar = ['A', 'B', 'C'];

for (const [index, element] of foobar.entries()) {
  console.log(index, element);
}


1
Điều này, thật đơn giản, thật tuyệt. Nó gần với python enumeratehơn [].map(), nó trả về một trình lặp.
Shanoor

2
Điều này không tương đương với việc sử dụng map ((el, idx) => ..), vì có thể bạn muốn thực hiện filternhưng vẫn giữ các chỉ mục bạn đã có trước khi lọc.
derekdreery

26

Array.prototype.mapđã cung cấp cho bạn chỉ mục làm đối số thứ hai cho thủ tục gọi lại ... Và nó được hỗ trợ hầu như ở mọi nơi.

['a','b'].map(function(element, index) { return index + ':' + element; });
//=> ["0:a", "1:b"]

Tôi cũng thích ES6

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]

cái này imo tốt hơnentries()
StephenBoesch

22

let array = [1, 3, 5];
for (let [index, value] of array.entries()) 
     console.log(index + '=' + value);


5

Xin lỗi nếu tôi không biết gì (một chút mới làm quen với JavaScript ở đây), nhưng bạn không thể sử dụng forEach? ví dụ:

function withIndex(elements) {
    var results = [];
    elements.forEach(function(e, ind) {
        results.push(`${e}:${ind}`);
    });
    return results;
}

alert(withIndex(['a', 'b']));

Cũng có câu trả lời của naomik phù hợp hơn cho trường hợp sử dụng cụ thể này, nhưng tôi chỉ muốn chỉ ra rằng nó forEachcũng phù hợp với hóa đơn.

ES5 + được hỗ trợ.


5

pythoniccung cấp một enumeratehàm hoạt động trên tất cả các tệp lặp, không chỉ mảng và trả về một lặp lại , như python:

import {enumerate} from 'pythonic';

const arr = ['a', 'b'];
for (const [index, value] of enumerate(arr))
    console.log(`index: ${index}, value: ${value}`);
// index: 0, value: a
// index: 1, value: b

Tiết lộ tôi là tác giả và người duy trì Pythonic


4
Hãy đề cập rằng bạn giúp phát triển pythonic. Theo Cách không trở thành người gửi spam trong Trung tâm trợ giúp của Stack Overflow, "Cộng đồng ở đây có xu hướng bỏ phiếu tự quảng cáo công khai và gắn cờ nó là spam. Hãy đăng những câu trả lời hay, có liên quan và nếu một số (nhưng không phải tất cả) xảy ra sản phẩm hoặc trang web của bạn, điều đó không sao cả. Tuy nhiên, bạn phải tiết lộ mối quan hệ của mình trong câu trả lời của bạn. "
Solomon Ucko

3
@Keyvan Solomon là hoàn toàn chính xác. Bạn sở hữu thư viện này, bạn là tác giả và người đóng góp duy nhất cho nó. Cách bạn chọn để cấp phép nó không liên quan. Bạn được yêu cầu tiết lộ quyền sở hữu hoặc liên kết của mình với bất kỳ thư viện, sản phẩm, bài báo nào, v.v. mà bạn giới thiệu hoặc liên kết đến trong bài đăng của mình. Đây là một yêu cầu rất đơn giản, không ai thô lỗ với bạn hoặc yêu cầu bất cứ điều gì vô lý.
Mudgar

Đã thêm theo yêu cầu của bạn
Keyvan

1

như KyleShanoornói là Array.prototype.entries ()

nhưng đối với newbie như tôi, khó có thể hiểu hết ý nghĩa của nó.

vì vậy ở đây đưa ra một ví dụ dễ hiểu:

for(let curIndexValueList of someArray.entries()){
  console.log("curIndexValueList=", curIndexValueList)
  let curIndex = curIndexValueList[0]
  let curValue = curIndexValueList[1]
  console.log("curIndex=", curIndex, ", curValue=", curValue)
}

tương đương với pythonmã:

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.