Эй, могу ли я стать {} в числе - PullRequest
0 голосов
/ 27 мая 2020

У меня есть это, но мне нужно получить это steamrollArray([1, {}, [3, [[4]]]]) должно вернуть [1, {}, 3, 4]. Но я получаю {} в моем массиве

let b = [];
let a = JSON.stringify(arr)
let replacedArr = (a.replace(/[\[\]']+/g, ''))

for (let i = 0; i <= replacedArr.length; i++) {

    if (replacedArr[i] == 1 || replacedArr[i] == 2 || replacedArr[i] == 3 || replacedArr[i] == 4) {
        b.push(replacedArr[i] * 1)
    } else if (replacedArr[i] == "a" || replacedArr[i] == "b") {
        b.push(replacedArr[i])
    } else if (replacedArr[i] == "{") {
        b.push(replacedArr[i] + "}")
    }

}

console.log(b)
return b

}

steamrollArray([1, {},
    [3, [
        [4]
    ]]
]);

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Это не очень обратно совместимо, но вы можете использовать Array.flat:

console.log([1, {}, [3, [[4]]]].flat(3));
0 голосов
/ 27 мая 2020

Вы были действительно близки к завершению после JSON.stringify(). Возможно, это не лучший вариант, но мы, по крайней мере, можем сделать этот метод в некоторой степени работоспособным. Он будет работать только с массивами верхнего уровня и уничтожит все массивы нижнего уровня.

Итак, чтобы исправить ваш код, давайте решим проблему попытки синтаксического анализа значений. Давайте вместо этого подумаем, как мы можем взять сгенерированную строку, снова сделать ее действительной JSON и просто отправить ее через JSON.parse().

Нам просто нужно добавить начало [ спереди и закрытие ] до конца. Мы можем сделать это с помощью литерала шаблона. Затем мы просто разбираем его. К счастью, с помощью API-цепочки мы можем избавиться от промежуточных шагов и просто сделать это в одной строке кода.

const steamrollArray = (arr) => JSON.parse(`[${JSON.stringify(arr).replace(/[\[\]']+/g, '')}]`)

console.log(steamrollArray([1, {},
    [3, [
        [4]
    ]]
]));

Теперь ... это сломается, если у нас есть массив внутри ключа объекта. Мы могли бы исправить это с помощью другого регулярного выражения, чтобы игнорировать любые [ или ] внутри совпадающей пары {}, но я оставлю это вам, если вы хотите принять это так.

Теперь, когда у нас есть этот код, давайте рассмотрим некоторые другие способы решения тех же проблем.

Сокращение и рекурсия

Массивы являются итеративными, и, следовательно, по ним можно перемещаться. У них могут быть даже крутые вспомогательные методы! Давайте использовать Array.concat() и Array.reduce(). Но что произойдет, если мы столкнемся с другим Array? Что ж, давайте рекурсивно воспользуемся этой функцией!

const steamrollArray = (arr) => arr.reduce((newArr, value) => newArr.concat(Array.isArray(value) ? steamrollArray(value) : value), [])

console.log(steamrollArray([1, {},
    [3, [
        [4]
    ]]
]));

Здесь много всего происходит, все сжато в одно, но если вы посмотрите это, то увидите, что я просто использую встроенные методы Array. Вы можете узнать больше об этих методах в MDN для массивов в JS.

Новые способы сделать это

Однако недавно мы увидели еще более новые способы просто сделай это для нас. Для этого конкретного варианта использования c он известен как сглаживание и в большинстве случаев будет flatten(), однако из-за некоторой исторической поддержки старых инструментов создания веб-сайтов он был реализован как flat(). Вы можете увидеть это в другом ответе в этом сообщении и на MDN .

0 голосов
/ 27 мая 2020

Вы можете использовать рекурсию для решения этой проблемы

let newArr = [];
const steamrollArray = (arr) => {
  for (let x of arr) {
    if (Array.isArray(x)) {
      steamrollArray(x);
    } else {
      newArr.push(x);
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...