, bu "Dizi comprehensions" olarak adlandırılan ve birçok biri olan, pek çok özelliği ECMAScript Harmony için önerilen Aslında, son sürümde gerçekte yer alıp almayacağı konusunda gerçek bir fikir olduğunu sanmıyorum. Firefox'ta "JavaScript 1.7" (bir "standardı" standardı "gerçekten'un yalnızca Mozilla tabanlı öğeler için geçerli olduğu) bir parçası olarak kullanabilirsiniz; Ancak, özellikle diğer tarayıcılarda sözdizimi hatası verdiğinde, FF'ye özgü sözdiziminden kaçınmanız daha iyidir.
Sen "Dizi Kapsam," için bir Google araması yaparak bu konuda daha fazla bilgi bulabilirsiniz ama belirtildiği gibi Mozilla özgü doğası nedeniyle, bu çok yararlı bir araçtır değil.
Sen ES5 tanıtıldı reduce()
Dizi yöntemiyle çok daha kodu olmadan benzer bir etkiyi elde edebilirsiniz:
//JavaScript has no "range" function, so let's make one
var range = function (begin, length) {
var i, ret = [];
for (i = begin; i < begin + length; i++) {
ret.push(i);
}
return ret;
};
var evens = range(0, 21).reduce(function (arr, cur) {
if (cur % 2 === 0) arr.push(cur);
return arr;
}, []);
olabilir biraz ayrıntılı kıyasla ne bile göz önünde tutarak (aradığını biz range()
işlevini oluşturmak zorundaydı). Ancak, çok fazla "kurulum" gerektirmeyen ve esas olarak problemin çözümüne yapışan nispeten kompakt bir çözümdür: bir diziden elemanların bir ikinci dizi oluşturması için filtreleme.
Ben tek satırlık yer azaltmak başardı, ancak korumak biraz unweildy olur, bu yüzden yerine iki satırı sürümü önermek karar verdi.Eğer bir-liner ilgilendiğiniz, işte burada:
//Don't forget to define "range()"
var evens = range(0, 21).reduce(function (arr, cur) {
return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr;
}, []);
Yine, bu ES5 kodudur. Eski tarayıcılarda çalışmasını istiyorsanız,
Array.reduce()
için destek sağlamak için bir shim ile gelmeniz gerekir. MDN burada birine sahiptir:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce
GÜNCELLEME:
Ben filter()
yerine reduce()
kullanılmış olmalıdır gibi görünüyor. Kodu daha temiz hale getirir. Önermek için OP teşekkürler! Eğer eski tarayıcılarda düzgün çalışıp çalışmayacağını sağlamak amacıyla bir dolgu gerekir böylece
var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });
Yine filter()
ES5 vardır.
_ "Bu tür bir sözdizimini açıklamak için hangi isim verilebilir?" _ - Bağladığınız makale "Array Anlaşmaları" olarak adlandırılır. – nnnnnn
Yanılıyor olabilirim, ama bu terimin bir dizinin içindeki "her" için atıfta bulunduğunu düşünüyorum. Sanırım diziler dışında kullanılan bu farklı “if” sözdizimini görmüştüm ama emin değilim. ? –
_Not dizisi sadece çok daha kompakttır, ancak okunması daha kolaydır, ** kavramı tanıdık bir kez **. Herkesin sözdizimini bildiğinden emin olduğumda bunu kullanmaya cesaret edebilirdim. Şiddetli bir psikopat olan bakıcı ve tüm ... – Laoujin