Как проверить формат массива (матрицы)?

#javascript #arrays #regex #validation #matrix

#javascript #массивы #регулярное выражение #проверка #матрица

Вопрос:

Я создаю страницу для умножения массива, и мне нужно проверить формат массива перед действием. Текстовое поле должно принимать только массивы в этом формате: [[1,2,3],[4,5,6],[7,8,9]] — матричный массив массивов строк.

Я пробовал использовать регулярные выражения, но я действительно не могу этого сделать. Есть ли другой способ?

Комментарии:

1. какую проверку вы пытаетесь создать?

2. Мне нужно проверить формат массива, который должен быть таким: [[1,2,3],[4,5,6],[7,8,9]].

3. Может ли элемент массива быть больше однозначных чисел? Например, ? [[1111,2,3],[7777,4,5],[0000,6,7]]

4. ДА. Также отрицательные числа.

5. Можно ли включать пробелы [1, 2, 3] ? Вы пытаетесь проверить, вводятся ли только числа?

Ответ №1:

попробуйте регулярное выражение, приведенное ниже

 ^  [ ([[[  d   ,]   ]  ,)   [[  d  ,]   ]  ]$
 

все в одном окончательном решении…

может управлять пробелами…

Комментарии:

1. Спасибо, но это не работает для такого массива, как этот: [[1,2,3],[4,5,6]] или [[1,2,3],[4,5,6],[7,8,9], [10,11,12] ..

2. подождите, дайте мне разобраться с этим

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

4. Это выглядит круто 🙂 Еще одна вещь: можете ли вы заставить его принимать пробелы между числами и массивами?

5. Не работает с десятичными числами, отрицательными числами, числами, начинающимися с плюса, числами в научной нотации, символами новой строки, табуляциями, …

Ответ №2:

Это может быть в непосредственной близости от

 var arr = [[1,2,3],[4,5,6],[7,8,9]],
  valid = arr.every(a => Array.isArray(a) amp;amp; a.length === 3 amp;amp; a.every(item => typeof item === "number"));
console.log(valid); 

Ответ №3:

Вы можете использовать JSON.parse() , Array.prototype.every()

 var res;
try {
  res = JSON.parse(document.querySelector("input").value)
        .every(function(arr) {return arr.every(Number)});
  console.log(res);
} 
// handle `JSON.parse()` error
catch (e) {
  console.log(e)
} 
 <input type="text" value="[[1,-2,3],[4,5,-6],[7,8,99999]]"> 

Комментарии:

1. очень круто .. к сожалению, не работает, когда в массивах есть элементы массива, такие как <input type="text" value="[[[1],-2,3],[4,5,-6],[7,[8],99999]]">

2. @Redu [[[1],-2,3],[4,5,-6],[7,[8],99999]] — это не формат массива, описанный OP?

3. OP говорит, что текстовое поле должно принимать только массивы в этом формате: [[1,2,3],[4,5,6],[7,8,9]] . Для меня это означает » нет [1,{0:2},3] и нет [1,[2],3] » . Я не так думаю ..?

4. @Redu Хотя этот формат также можно обработать, слегка изменив javascript при ответе.

5. @Redu Не уверен, что вы «неправильно думаете», хотя OP не включил эти примеры в вопрос или комментарии в качестве возможного ввода. С небольшими корректировками javascript любой из примеров входных данных, которыми вы поделились, может возвращать тот же результат, используя тот же исходный шаблон при ответе. Обратите внимание также, что ваше решение начинается с массива в качестве входных данных, а не строки; который будет иметь .value <input> элемент.

Ответ №4:

Хотя вы уже приняли ответ, я все же хотел бы предложить это решение:

 function getValidArray(txt) {
    try {
        var arr = JSON.parse(txt);
    } catch (e) {}
    return Array.isArray(arr) 
           amp;amp; arr.length == 3
           amp;amp; arr.every( sub => Array.isArray(arr) 
                         amp;amp; sub.length === 3 
                         amp;amp; sub.every ( v => typeof v == 'number' ) )
           amp;amp; arr;
}

// I/O for snippet:

var inp = document.querySelector('input');
var out = document.querySelector('div');

inp.oninput = function() {
    var txt = inp.value;
    var result = getValidArray(txt);
    out.textContent = result ? JSON.stringify(result) : 'invalid';    
};
inp.oninput(); 
 input { width: 100% } 
 Array: <input value="  [[1,88,-45.2],     [1.2e 2, 1e-1,-0.9],[  0,22, 1.33]  ]">
<div></div> 

Этот тест завершается успешно, когда текст представляет собой массив чисел размером 3×3.

Он будет принимать пробелы вокруг чисел, запятых, … и будет принимать отрицательные и десятичные значения, даже научные обозначения.