Подтвердить что ты не робот

JavaScript - получить элемент массива, выполняющий условие

Я изучаю JavaScript с помощью W3C, и я не нашел ответа на этот вопрос.

Я пытаюсь сделать некоторые манипуляции с элементами массива, которые выполняют некоторые условия.

Есть ли способ сделать это, кроме запуска элементов массива в цикле for? Может быть, что-то вроде (на других языках):

foreach (object t in tArray)
   if (t follows some condition...) t++;

другое дело, иногда я хочу использовать значение элемента, а иногда я хочу использовать его в качестве ссылки. Какова синтаксическая разница?

Кроме того, я буду рад за рекомендации по более обширным сайтам, чтобы выучить JavaScript. спасибо

4b9b3361

Ответ 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);

Я надеюсь, что ответ на этот давний вопрос!