Поиск элементов столбца и возвращаемой строки во вложенном массиве

#javascript #jquery #arrays #multidimensional-array

#javascript #jquery #массивы #многомерный массив

Вопрос:

У меня есть этот массив с внутренними массивами:

 var testdata1= [
  ["1001","55","58"],
  ["1002","64"],
  ["1003","73","76","77"],
  ["1004","81","84"],
  ["1005","97"],
];
  

Я хочу найти строку по 1-му столбцу, затем поместить все остальные элементы в этой строке в новый массив. Итак, если бы я искал "1003" , я бы получил:

 newarray = [["73","76","77],];
  

После 3 часов бесплодных поисков я был бы очень признателен, если бы кто-нибудь мог избавить меня от страданий и показать мне лучший способ сделать это. Любая помощь высоко ценится.

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

1. Для этого просто нужен цикл для поиска строки и другой цикл для копирования элементов в новый массив…

Ответ №1:

Из вопроса неясно, что вы хотите делать, если есть более одного совпадения. Если вас интересует только первое совпадение, используйте метод find, если вы хотите, чтобы совпадали все строки, используйте filter. find возвращает одну строку, filter возвращает новый массив со всеми совпадающими строками.

Если вы хотите отказаться от ключевого столбца, вы можете использовать оператор spread (как предлагает @Shidersz) или метод slice.

например

 let hits = arr.filter(row => row[0] === "1004")
           .map(row => row.slice(1));
  

Должны возвращать попадания = [[«81″,»84»]];

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

Фильтр возвращает новый массив совпадающих строк, затем карта просматривает этот массив и создает новый, каждый элемент которого представляет собой строку с удаленным первым столбцом.

Этот вид «потоковой» обработки имеет тенденцию заменять явные циклы. Возможно, это станет понятнее, как только вы освоитесь с этим.

Прочитайте ссылку на массив JavaScript

Если вы еще этого не сделали

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

1. На самом деле это очень полезный ввод, и он высоко ценится.

Ответ №2:

Просто используйте .forEach() цикл, как показано ниже. Этот код перебирает массив, проверяет, является ли первый элемент в текущем массиве тем числом, которое вы хотели, и если да, добавляет все значения этого массива (кроме первого) в выходной массив.

 var testdata1 = [
  ["1001", "55", "58"],
  ["1002", "64"],
  ["1003", "73", "76", "77"],
  ["1004", "81", "84"],
  ["1005", "97"],
];
var searchNumber = 1003;
var output = [];

testdata1.forEach(e => {
  if (e[0] == searchNumber) {
    output.push(e.slice(1));
  }
});

console.log(output);  

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

1. Хорошо, теперь я чувствую себя глупо. Большое спасибо за вашу помощь.

2. @Silverburch приветствую вас. Принимайте ответ, какой бы ответ ни помог вам больше всего, чтобы другие тоже знали это

Ответ №3:

Одним из решений является использование Array.find() и деструктурирования:

 var testdata1= [
  ["1001","55","58"],
  ["1002","64"],
  ["1003","73","76","77"],
  ["1004","81","84"],
  ["1005","97"],
];

const findByFirstCol = (arr, colVal) =>
{
   let [first, ...rest] = arr.find(x => x[0] === colVal) || [,"Nothing found"];
   return [rest];
}

console.log(findByFirstCol(testdata1, "1003"));
console.log(findByFirstCol(testdata1, "1009"));  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

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

1. findByFirstCol(testdata1, "1006")

2. Отличная альтернатива — но, к сожалению, немного сложная для моего бедного мозга!

3. @Silverburch Не позволяйте коду напугать вас, вы можете узнать, как использовать эти функции в будущем. В любом случае спасибо!