#javascript #arrays #indexof #arrayofarrays
#javascript #массивы #indexof #arrayofarrays
Вопрос:
Я новичок в JavaScript, и я пытаюсь удалить массив из массива, если там есть буква
Пример: [[«x»,»y», 2],[2, 4],[5, 3],[6, 9],[» a», 1]]
Ожидаемый результат будет: [[2, 4],[5, 3],[6, 9]]
;
Комментарии:
1. Ожидаемый результат?
2. Будет ли удален первый массив (теперь пустой) или в результате останется пустой массив? Пожалуйста, укажите, каким будет ожидаемый результат для вашего примера
data
.3. Никогда не используйте один и тот же индекс в циклах
inner
иouter
4. Ваши две проблемы, как я их вижу: вы используете
i
то, что, возможно, вы хотели использоватьj
в объявлении внутреннего цикла. Во-вторых, вы не можете сделать этоindexOf
с числом, поэтому ваши данные будут сброшены, как только они попадут в2
.5. Что, если данный массив является
[["y","x",2],[2, 4],[5, 3],[6, 9]]
Ответ №1:
В вашем случае я думаю, что проблема во внутреннем цикле. Потому что data[i][j]
будет "x","y",2,4,5...
, и вы не можете применить indexOf()
к числам, поэтому это выдает ошибку.
Вы можете использовать use Array.prototype.every()
внутри Array.prototype.filter()
var data = [["y","x",2],[2, 4],[5, 3],[6, 9]]
let res = data.filter(x => x.every(x =>!isNaN(x)));
console.log(res)
Комментарии:
1. @Code Maniac Вы правы Вопрос OP не соответствует, потому что 1) его ожидаемый результат удаляет элементы 2) Он использует что-то вроде
[p{IsLatin}s]
, о котором он не рассказал2. Да, вот почему это было дополнительное примечание, приятель 🙂 в любом случае, просто очищаю свои комментарии, поскольку OP уже предоставил дополнительные разъяснения по этому вопросу, поэтому они теперь неактуальны
Ответ №2:
Ваш код не работает по двум причинам:
-
Вы используете
i
вместоj
в объявлении внутреннего цикла -
Вы пытаетесь сделать
indexOf()
с числом
Ваш желаемый результат оставляет несколько незначительных неопределенностей, но вот решение, использующее Array.filter()
и Array.every()
.
var data = [["a","b",1,2],["y", "x"],[2, 4],[5, 3],[6, 9]];
var result = data.filter(group => group.every(item => !isNaN(item)));
console.log(result);
РЕДАКТИРОВАТЬ: Обновленный код для устранения этого комментария:
если в первом массиве есть какая-либо буква, она будет удалена
Комментарии:
1. Большое вам спасибо. Вы были очень полезны.
2. @jordirigau Спасибо, предоставлено с вашим обновлением,
reduce()
в этом нет необходимости. Я обновлял свой ответ, но увидел, что Махир был на шаг впереди — вместо этого рассмотрите его решение!
Ответ №3:
Для достижения ожидаемого результата с помощью одного цикла используйте filter и Math.max, если массив содержит строку, он возвращает NaN для Math.max
var data = [["x","y", 2],[2, 4],[5, 3],[6, 9],["a", 1]];
console.log(data.filter(v => !isNaN(Math.max.apply(Math, v))));