JavaScript - получить элемент массива, выполняющий условие
Я изучаю JavaScript с помощью W3C, и я не нашел ответа на этот вопрос.
Я пытаюсь сделать некоторые манипуляции с элементами массива, которые выполняют некоторые условия.
Есть ли способ сделать это, кроме запуска элементов массива в цикле for?
Может быть, что-то вроде (на других языках):
foreach (object t in tArray)
if (t follows some condition...) t++;
другое дело, иногда я хочу использовать значение элемента, а иногда я хочу использовать его в качестве ссылки. Какова синтаксическая разница?
Кроме того, я буду рад за рекомендации по более обширным сайтам, чтобы выучить JavaScript.
спасибо
Ответы
Ответ 1
В большинстве браузеров (не IE <= 8) массивы имеют метод filter
, который не делает то, что вы хотите но создает вам массив элементов исходного массива, удовлетворяющих определенному условию:
function isGreaterThanFive(x) {
return x > 5;
}
[1, 10, 4, 6].filter(isGreaterThanFive); // Returns [10, 6]
Mozilla Developer Network имеет много хороших ресурсов JavaScript.
Ответ 2
Вы можете использовать for ... in
в JavaScript:
for (var key in array) {
if (/* some condition */) {
// ...
}
}
Как и в JavaScript 1.6, вы также можете использовать это:
for each (var element in array) {
// ...
}
Они предназначены главным образом для прохождения свойств объекта. Вы должны просто использовать ваш for
-loop.
РЕДАКТИРОВАТЬ: Вы можете использовать инфраструктуру JavaScript, такую как jQuery, чтобы устранить эти проблемы с несколькими браузерами. Попробуйте. Его $.each()
-method выполняет эту работу.
Ответ 3
О массивах
То, что вы обычно хотите для итерации по массиву, это метод forEach:
arr.forEach(function(el) {
alert(el);
});
В вашем конкретном случае для увеличения каждого элемента массива я рекомендую метод map:
arr = arr.map(function(t){ return t+1; });
Есть также filter, reduce и другие, что тоже пригодится.
Но, как уже упоминал Тим Даун, они не будут работать по умолчанию в IE. Но вы также можете легко добавить эти методы для IE, как показано в документации по MDC, или на самом деле вы даже можете писать более простые версии, чем те, которые содержатся в документации MDC (я не знаю, почему они так не JavaScript-y там):
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(func, scope) {
for (var i = 0, len = this.length; i < len; i++) {
func.call(scope, this[i], i, this);
}
};
}
Но не используйте конструкцию for ... in
для массивов - это предназначено для объектов.
О ссылках
Другое дело, иногда я хочу использовать значение элемента, а иногда я хочу использовать его в качестве ссылки. Какова синтаксическая разница?
В JavaScript каждая переменная на самом деле является ссылкой на какой-либо объект. Но эти ссылки передаются по значению. Позвольте мне объяснить...
Вы можете передать объект функции, которая изменяет объект, и изменения будут видны вне функции:
function incrementHeight(person) {
person.height = person.height + 1;
}
var p = {height: 10);
alert(p.height); // outputs: 10
incrementHeight(p);
alert(p.height); // outputs: 11
Здесь вы изменяете значение, на которое указывает опорная точка person
, и поэтому изменение будет отображаться вне функции.
Но что-то вроде этого не удается:
function incrementHeight(height) {
height = height + 1;
}
var h = 10;
alert(h); // outputs: 10
incrementHeight(h);
alert(h); // outputs: 10
Здесь вы создаете совершенно новый объект 11
и назначаете его ссылку на переменную height
. Но переменная h
вне функции все еще содержит старую ссылку и поэтому остается указывать на 10
.
Ответ 4
Здесь короткий путь, чтобы написать фильтр.
Из массива чисел он возвращает все значения, превышающие 5.
myArray.filter((x) => { return x > 5; })
Пример использования:
var filterResult = [1, 10, 4, 6].filter((x) => { return x > 5; });
console.log(filterResult); // returns [ 10, 6 ]
И вот фильтр для массива объектов, который проверяет условие свойство.
myArray.filter((x) => { return x.myNumber > 5; })
Пример использования:
var myArray = [{myNumber: 1, name: 'one'}, {myNumber: 3, name: 'tree'}, {myNumber: 6, name: 'six'}, {myNumber: 8, name: 'eight'}];
var result = myArray.filter((x) => { return x.myNumber > 5; });
console.log(result); // returns [ { myNumber: 6, name: 'six' }, { myNumber: 8, name: 'eight' } ]
Ответ 5
Натолкнулась на ту же проблему. Tim Down приблизился, ему просто понадобилась оболочка для длины фильтрованного массива:
// count elements fulfilling a condition
Array.prototype.count = function (f) {
return this.filter(f).length;
};
Использование:
// get the answer weight from the question values array
var w = Math.pow(q.values.count(function(v) { return v !== -1; }), -1);
Я надеюсь, что ответ на этот давний вопрос!