#javascript #ecmascript-6
#javascript #ecmascript-6
Вопрос:
У меня есть вложенный массив, подобный следующему
var x=[1,2,[3,4,[5,6,[7,8,[9,10]]]]]
Я хочу выполнить некоторую операцию в массиве, предположим, умножение каждого элемента на 2, тогда результат будет следующим
[2,4,[6,8,[10,12,[14,16,[18,20]]]]]
До сих пор я делал следующее
function nestedArrayOperation(arr){
var p=[];
arr.forEach(function(item,index){
if(Array.isArray(item)){
p.push(nestedArrayOperation(item))
return
}
p.push(item*2);//multiply by 2
return
});
return p;
}
function nestedArrayOperation(arr){
var p=[];
arr.forEach(function(item,index){
if(Array.isArray(item)){
p.push(nestedArrayOperation(item))
return
}
p.push(item*2);//Multiply by 2
return
});
return p;
}
var x=[1,2,[3,4,[5,6,[7,8,[9,10]]]]]
console.log(nestedArrayOperation(x))
.as-console-row-code{white-space: nowrap!important;}
Здесь я выполняю операцию внутри жестко запрограммированной функции, я хочу создать общую nestedArrayOperation, где операция будет определяться пользователем, например, map, reduce и т.д. функция работает.
Как и в map
функции, мы можем выполнить любую операцию [1,2,3,4].map(x=> x **2)// она вернет [1,4,9,16] или [1,2,3,4].map(x=> x * 2) // она вернет [2,4,6,8]
Пример, подобный следующему:
arr.nestedArrayOperation(x=>x*2)
//or
arr.nestedArrayOperation(x=>x 5)
Пожалуйста, помогите создать этот универсальный
Спасибо
Комментарии:
1. ты имеешь в виду
Array.prototype.Yourfunction
?2. Это я знаю, но как это будет похоже на функцию map и reduce
3. @SourabhSomani как функция map и reduce Можете ли вы быть более конкретным?
4. Я могу добавить функцию в массив, используя
array.prototype
но я хочу сделать это общими средствамиx 5
илиx 3
или любой операцией, которую я могу5. @SourabhSomani и вы ожидаете, что часть рекурсии будет обрабатываться этой функцией?
Ответ №1:
Вы ищете
function nestedArrayOperation(arr, callback) {
return arr.map(function(item,index) {
if (Array.isArray(item))
return nestedArrayOperation(item, callback);
else
return callback(item, index);
});
}
var example = [1,2,[3,4,[5,6,[7,8,[9,10]]]]];
console.log(nestedArrayOperation(example, x=>x*2));
Ответ №2:
Вы могли бы выполнить обратный вызов, который проверяет значение и сопоставляет массив или умноженное значение.
Это предложение использует Array#map
и возвращает новый массив.
var times2 = v => Array.isArray(v) ? v.map(times2) : 2 * v,
x = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]],
x2 = x.map(times2);
console.log(x2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №3:
- Передайте функцию обратного вызова в качестве параметра функции-прототипа.
- Затем передайте также с рекурсивным вызовом функции
- Для более простого использования формы
ternary operator
вArray#map
Array.prototype.nestedArrayOperation = function(callback) {
return this.map((item, index) => Array.isArray(item) ? item.nestedArrayOperation(callback): callback(item));
}
var x = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]
console.log(x.nestedArrayOperation((x) => x 2))
console.log(x.nestedArrayOperation((x) => x * 2))
.as-console-row-code {
white-space: nowrap!important;
}