Опция в вложенном массиве - PullRequest
3 голосов
/ 26 марта 2019

У меня есть вложенный массив, как показано ниже

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;}

Здесь я выполняю операцию внутри жестко закодированной функции, я хочу сделать Generic nestedArrayOperation , где операция будет решаться пользователемкак карта, уменьшить и т. д. функция работает.

Как и в функции 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)

Помогите, пожалуйста, создать универсальный

Спасибо

Ответы [ 3 ]

3 голосов
/ 26 марта 2019

Вы ищете

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));
3 голосов
/ 26 марта 2019

Вы можете принять обратный вызов, который проверит значение и отобразит массив или умноженное значение.

Это предложение использует 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; }
1 голос
/ 26 марта 2019
  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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...