Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача аргументом функции функцию (https://javascript.ru/forum/misc/51727-peredacha-argumentom-funkcii-funkciyu.html)

Brainsss 17.11.2014 14:10

Передача аргументом функции функцию
 
Добрый день всем. Не могу разобраться с следующим примером.
Есть функция в которой аргументами выступают массив и функция. Нужно написать тело функции, что бы аргументами выступали элемент массива, индекс элемента массива и сам массив.
function knowName(arr, func){
//тело функции ???
}

Что бы при вызове функции передавались аргументы указанные выше. Например:
knowName([1,2,3,4], function(elem, index, arr){// какой то код который оперирует elem, index, arr})

Где elem - элементы массива,
index - индекс элемента массива,
arr - сам массив.

skrudjmakdak 17.11.2014 14:15

function one (array, fn) {
	for (var i = 0, ln = array.length; i < ln; ++i) {
		fn(array[i], i, array);
	}
}

one ([1, 2, 3], function (el, i, ar) {
	console.log(el);
	console.log(i);
	console.log(ar);
});

ruslan_mart 17.11.2014 14:38

Чем нативный forEach не устроил?

Brainsss 17.11.2014 14:43

Мне нужно самому написать, или придумать логику. Где можно найти код функции forEach?

skrudjmakdak 17.11.2014 15:00

function forEach (array, fn) {
for (var i = 0, ln = array.length; i < ln; ++i) {
        fn(array[i], i);
    }
}

forEach([1,2,3], function (v) {console.log(v);})


есть встроенный в современных браузерах
[1, 2, 3].forEach(function (v) {console.log(v);})

Brainsss 17.11.2014 15:07

А если нам нужно что то возвращать? Например такой код
function example(arr, func) {
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
	}
var a = example(['abc', 'def', 'ghi'], function (elem) {
	return typeof elem === 'string';
});
console.log(a);

Почему выводит undefined? И как сделать что бы с return нормально работало?

Erolast 17.11.2014 15:08

Цитата:

for (var i = 0, *!*ln = array.length; i < ln*/!*; ++i) {
        fn(array[i], i);
    }
}

Зачем так?
for (var i = 0; i < array.length; ++i) {
        fn(array[i], i);
    }

Erolast 17.11.2014 15:10

Цитата:

Сообщение от Brainsss (Сообщение 341317)
А если нам нужно что то возвращать? Например такой код
function example(arr, func) {
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
	}
var a = example(['abc', 'def', 'ghi'], function (elem) {
	return typeof elem === 'string';
});
console.log(a);

Почему выводит undefined?

Потому что функция example ничего не вернула - логично, да?

Brainsss 17.11.2014 15:12

А как все это связать, когда пишу return в example, работает не так как ожидалось. Подскажите плиз

ruslan_mart 17.11.2014 15:13

Цитата:

Сообщение от Erolast
Зачем так?

Чтобы каждый раз не обращаться к свойству length. Просто, так быстрее работает, но это тут вообще не принципиально, ибо разница в скорости ничтожна.

Brainsss 17.11.2014 15:24

Цитата:

Сообщение от Erolast (Сообщение 341319)
Потому что функция example ничего не вернула - логично, да?

А как должно быть?
function example(arr, func) {
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
		return func();
	}

так?

ruslan_mart 17.11.2014 15:26

Brainsss, а что ты хочешь, чтобы она возвращала?

Brainsss 17.11.2014 15:29

Результат операции над элементами массива.
function example(arr, func) {
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
	}
var a = example(['abc', 'def', 'ghi'], function (elem) {
	console.log(elem)
	return typeof elem === 'string';
});
console.log(a);

в данном случае должно быть true.

ruslan_mart 17.11.2014 15:31

Brainsss, ну так ведь не логично. У тебя же несколько элементов в массиве, следовательно, на каждый элемент своя операция, а вернуть должно что-то одно.

Brainsss 17.11.2014 15:34

А нельзя так сделать, что бы проверяло каждый элемент, и если все тру то тру, если хоть один фолс, то и возвращает фолс?

krutoy 17.11.2014 15:37

Цитата:

Сообщение от Brainsss (Сообщение 341317)
А если нам нужно что то возвращать? Например такой код
function example(arr, func) {
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
	}
var a = example(['abc', 'def', 'ghi'], function (elem) {
	return typeof elem === 'string';
});
console.log(a);

Почему выводит undefined? И как сделать что бы с return нормально работало?

function example(arr, func) {
   try{
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
      }catch(e){return e}
	}
var a = example(['abc', 'def', 'ghi'], function (elem) {
	throw typeof elem === 'string';
});
console.log(a);

ruslan_mart 17.11.2014 15:44

Brainsss,

function arrayTypeOf(array, type) {
    for(var i=0; i<array.length; i++) {
        if(typeof array[i] != type) return false;
    }
    return true;
};



var a = arrayTypeOf(['abc', 'def', 'ghi'], 'string');
alert(a); //true

var b = arrayTypeOf(['abc', 'def', 5], 'string');
alert(b); //false

var c = arrayTypeOf([1, 4, 2], 'number');
alert(c); //true

Erolast 17.11.2014 15:47

Цитата:

Сообщение от krutoy (Сообщение 341333)
function example(arr, func) {
   *!*try{*/!*
	for (var i = 0; i < arr.length; i++) {
		func(arr[i], i);
		}
      *!*}catch(e){return e}*/!*
	}
var a = example(['abc', 'def', 'ghi'], function (elem) {
	*!*throw*/!* typeof elem === 'string';
});
console.log(a);

Что за новый прием?

Brainsss 17.11.2014 15:49

Да, это понятно, но смысл в том что должна быть именно функция в параметрах которой тоже функция( в которой могут меняться условия для проверки элементов массива и индексов эл массива). Но все равно спасибо.

ruslan_mart 17.11.2014 15:51

Brainsss, для таких случаев есть нативный метод массива - filter. Рекомендую почитать про него.

Brainsss 17.11.2014 16:12

Всем спасибо. Решил. Просто нужен был метод every. Спасибо отдельное Ruslan_xDD, за правильную наводку на мысль.:)


Часовой пояс GMT +3, время: 09:30.