我正在尋找一種類似于 Python 的方法:
for a,b in zip(c,d) :
我正在嘗試使用 javascript 中的 for... of 回圈來做到這一點,但我只是找不到如何...類似于:
const b = [2,3,5]
const d = [['e1' , 'e2' , 'e3'], ['i1', 'i2'],
['o1', 'o2', 'o3', 'o4']]
for (const a of b, const c of d) {
instruction(a,c)
}
謝謝
uj5u.com熱心網友回復:
如果我查找 zip 函式,它只是按索引組合每個條目,您應該能夠使用普通函式很容易地模擬它,但是為了保持它的迭代器方面,您可以使用生成器函式
const b = [2,3,5];
const d = [['e1' , 'e2' , 'e3'], ['i1', 'i2'],
['o1', 'o2', 'o3', 'o4']];
function *zip( ...iterables ) {
const inputs = iterables.map( iterator => Array.isArray( iterator ) ? iterator : Array.from( iterator ) );
const size = Math.min( ...inputs.map( i => i.length ) );
for (let i = 0; i < size; i ) {
yield inputs.map( input => input[i] );
}
}
console.log( 'iterating with arrays' );
for (const entry of zip(b, d)) {
console.log( entry );
}
console.log( 'iterating with other iterators' );
for (const entry of zip(b, zip(b, d))) {
console.log( entry );
}
讓我對上述答案感到困擾的是,它可能會在一開始就讀取任何可迭代的內容,使其可能效率低下(取決于輸入的大小,以及每次迭代的復雜程度)
所以考慮到這一點,與其把所有的迭代器都變成一個陣列,然后像這樣評估它們,實際上更有意義的是利用[Symbol.iterator]每個引數,然后一個接一個地進行迭代。
我添加了一個簡單的創建最多最大nextNumberGenerator數字的陣列來證明這一點。在原始答案中,它會在任何結果可用之前迭代所有最大數字,但使用更新的功能,它只會評估其他可能的組合
我只添加了一個帶有Set引數的測驗,并對其進行了一些輸入驗證。因此,如果您在某處使用此代碼,請務必為您的用例撰寫自己的測驗:)
const b = [2, 3, 5];
const d = [['e1', 'e2', 'e3'], ['i1', 'i2'],
['o1', 'o2', 'o3', 'o4']];
const set = new Set(['Angus', 'Bob', 'Daisy']);
function* nextNumberGenerator(max) {
let current = 0;
while (current < max) {
console.log('returning ' current ' of ' max);
yield current ;
}
}
function* zip(...iterables) {
const inputs = iterables.map(iterator => iterator[Symbol.iterator] ? iterator[Symbol.iterator]() : null);
if (inputs.some(v => v === null)) {
throw new Error('ArgumentException: At least one argument is not iterable');
}
let done = false;
while (!done) {
const result = [];
for (const iterator of inputs) {
const value = iterator.next();
if (value.done) {
done = true;
break;
}
result.push(value.value);
}
if (!done) {
yield result;
}
}
}
console.log('iterating with arrays');
for (const entry of zip(b, d, set)) {
console.log(entry);
}
console.log('iterating with other iterators');
for (const entry of zip(b, zip(b, d), nextNumberGenerator(10), set)) {
console.log(entry);
}
另請注意,這只會處理同步迭代,但不會處理異步迭代。
有關可迭代物件的更多資訊,您可以在這里查看:
- https://javascript.info/async-iterators-generators
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/512363.html
上一篇:求和直到達到一個值
下一篇:無法解決這個for回圈
