Операция во вложенном массиве

#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:

  1. Передайте функцию обратного вызова в качестве параметра функции-прототипа.
  2. Затем передайте также с рекурсивным вызовом функции
  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;
}