Фильтр Javascript против проблемы с картой - PullRequest
16 голосов
/ 14 марта 2010

Как продолжение моего минимума / максимума для массива объектов, я размышлял о сравнении производительности фильтра и карты.

Итак, я собрал тест на значения в своем коде, как собирался посмотреть на результаты в FireBug.

Это код:

var _vec = this.vec;
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; }));
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; }));

Версия map ped возвращает правильный результат. Однако версия filter ed возвращает NaN. Разбивая его, проходя и, наконец, проверяя результаты, может показаться, что внутренняя функция возвращает свойство x _vec, но фактический массив, возвращаемый из filter, является нефильтрованным _vec.

Я считаю, что мое использование filter правильно - кто-нибудь еще может увидеть мою проблему?

Вот простой тест:

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>S:GTC Map Test</title>
</head>
<body>
<script type="text/javascript">
function vector(x,y,z) { this.x = x; this.y =y; this.z=z; }
var vec = [];
vec.push(new vector(1,1,1));
vec.push(new vector(2,2,2));
vec.push(new vector(2,3,3));
var _vec = vec;
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; }));
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; }));

document.write("<br>filter = " + min_x);
document.write("<br>map = " + min_y);
</script>
</body>
</html>

Ответы [ 2 ]

48 голосов
/ 14 марта 2010

Нет, метод filter не возвращает неотфильтрованный массив. Возвращает массив, содержащий элементы, в которых внутренняя функция возвращает true.

Поскольку вы не возвращаете логическое значение из внутренней функции, значение преобразуется в логическое, поэтому ссылка на объект преобразуется в true. Таким образом, он возвращает новый массив, который содержит все элементы из исходного массива.

Метод filter не делает то же самое, что метод map. Метод map используется для преобразования каждого элемента массива, а метод filter - для выбора определенных элементов массива. Сравнение производительности между методами является спорным, поскольку только один из них делает то, что вы хотите.

13 голосов
/ 24 октября 2017

Цитируется из:

JavaScript: полное руководство
Дэвид Фланаган

карта ()

Метод map() передает каждый элемент массива, в котором он находится вызывается к указанной вами функции и возвращает массив, содержащий значения, возвращаемые этой функцией.

Например:

a = [1, 2, 3];

b = a.map(function(x) { return x*x; });  // b is [1, 4, 9]

Функция, которую вы передаете map (), вызывается так же, как Функция передана в forEach (). Для метода map (), однако, Функция, которую вы передаете, должна возвращать значение. Обратите внимание, что map () возвращает новый массив: он не изменяет массив, к которому он вызывается. Если этот массив разреженный, возвращенный массив будет разреженным таким же образом: он будет имеют одинаковую длину и одинаковые недостающие элементы.

фильтр ()

Метод возвращает массив, содержащий подмножество элементов массив, на котором он вызывается. Функция, которую вы передаете ей, должна быть Предикат: функция, которая возвращает истину или ложь. Предикат вызывается так же, как для forEach () и map (). Если возвращаемое значение истинно, или значение, которое преобразуется в true, тогда элемент передается в Предикат является членом подмножества и добавляется в массив станет возвращаемым значением.

Примеры:

a = [5, 4, 3, 2, 1];

smallvalues = a.filter(function(x) { return x < 3 });   // [2, 1]

everyother = a.filter(function(x,i) { return i%2==0 }); // [5, 3, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...