Выполните поиск в индексированном массиве и верните полный массив, если совпадения найдены в javascript

#javascript

#javascript

Вопрос:

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

 var arr = [ 
[ 'AAAA.10', 'S10' ],
[ 'AAAA.10', 'S11' ],
[ 'AAAA.12', 'S12' ],
[ 'AAAA.13', 'S13' ],
[ 'AAAA.14', 'S14' ] ]
  

Я хочу выполнить поиск по значениям массива, если какие-либо совпадения найдены, я хочу вернуть весь массив.

Если я ищу, как 10 тогда он должен проверить значения массива, если совпадения найдены (так что совпадение есть AAAA.10 ), тогда он должен вернуть весь массив следующим образом: [[ 'AAAA.10', 'S10' ], [ 'AAAA.10', 'S11' ]] .

Я пробовал использовать приведенный ниже код, но он не работает :

 console.log(arr.find('10'));
  

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

Ответ №1:

Используя forEach и find

 var arr = [
  ['AAAA.3', 'S3'],
  ['AAAA.4', 'S4'],
  ['AAAA.5', 'S5'],
  ['AAAA.6', 'S6'],
  ['AAAA.7', 'S7'],
  ['AAAA.8', 'S8'],
  ['AAAA.9', 'S9'],
  ['AAAA.10', 'S10'],
  ['AAAA.10', 'S11'],
  ['AAAA.12', 'S12'],
  ['AAAA.13', 'S13'],
  ['AAAA.14', 'S14']
];
var arr1 = [];

function a(str) {
  arr.forEach(e => {
    e.find(x => {
      if (x.includes(str)) {
        arr1.push(e)
      }
    })
  })
}
a('10');
console.log(arr1);  

Ответ №2:

Вы можете использовать Array.find для проверки каждого вложенного массива, содержит ли он требуемую строку, а затем накапливать результаты с помощью Array.reduce :

 var arr = [ [ 'AAAA.3', 'S3' ],
[ 'AAAA.4', 'S4' ],
[ 'AAAA.5', 'S5' ],
[ 'AAAA.6', 'S6' ],
[ 'AAAA.7', 'S7' ],
[ 'AAAA.8', 'S8' ],
[ 'AAAA.9', 'S9' ],
[ 'AAAA.10', 'S10' ],
[ 'AAAA.10', 'S11' ],
[ 'AAAA.12', 'S12' ],
[ 'AAAA.13', 'S13' ],
[ 'AAAA.14', 'S14' ] ];

function searchStr(search){
  const output = arr.reduce((acc, ele) => {
   let arr = ele.find(str => str.includes(search));
   return arr ? acc.concat(ele) : acc;
  }, []);  
  return output;
}
console.log(searchStr("10"));  

Ответ №3:

Вы можете split найти первый элемент во вложенном массиве по адресу . и использовать filter следующим образом:

 let arr=[['AAAA.3','S3'],['AAAA.4','S4'],['AAAA.5','S5'],['AAAA.6','S6'],['AAAA.7','S7'],['AAAA.8','S8'],['AAAA.9','S9'],['AAAA.10','S10'],['AAAA.10','S11'],['AAAA.12','S12'],['AAAA.13','S13'],['AAAA.14','S14']]

let result = arr.filter(a => a[0].split('.')[1] === "10")

console.log(result)  

Если у вас есть поддержка деструктурирования, вы можете сделать:

 arr.filter(([key]) => key.split('.')[1] === "10")
  

Обновить:

Если вы хотите выполнить поиск по обоим индексам, вы можете использовать includes :

 var arr=[['AAAA.3','S3'],['AAAA.4','S4'],['AAAA.5','S5'],['AAAA.6','S6'],['AAAA.7','S7'],['AAAA.8','S8'],['AAAA.9','S9'],['AAAA.10','S10'],['AAAA.10','S11'],['AAAA.12','S12'],['AAAA.13','S13'],['AAAA.14','S14']]

function getResults(arr, search){
  return arr.filter(a => a[0].includes(search) || a[1].includes(search))
}

console.log(getResults(arr, "10"))
console.log(getResults(arr, "S1"))  

Ответ №4:

 function checkNum(arr, num) {
    return arr.filter(ele => ele[0].split('.')[1] === String(num))
}
checkNum(arr, 10);
  

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

1. num вы упомянули, что это строка. Значение поиска может быть любым

2. Я не хочу разделяться, пользователь будет искать как AA или S1 или что угодно

Ответ №5:

Вы можете попробовать этот код:

 var arr = [ [ 'AAAA.3', 'S3' ],
[ 'AAAA.4', 'S4' ],
[ 'AAAA.5', 'S5' ],
[ 'AAAA.6', 'S6' ],
[ 'AAAA.7', 'S7' ],
[ 'AAAA.8', 'S8' ],
[ 'AAAA.9', 'S9' ],
[ 'AAAA.10', 'S10' ],
[ 'AAAA.10', 'S11' ],
[ 'AAAA.12', 'S12' ],
[ 'AAAA.13', 'S13' ],
[ 'AAAA.14', 'S14' ] ];


function search(index){
  for(i = 0; i<=arr.length-1; i  ){
    if(arr[i].indexOf(index)>-1){
      console.log(arr[i]);
    }
  }
 }
 
 search("AAAA.10");  

Ответ №6:

Если все элементы в вашем внутреннем массиве будут строковыми значениями, вы можете объединить их и выполнить поиск по строке.

 var arr = [ [ 'AAAA.3', 'S3' ], [ 'AAAA.4', 'S4' ], [ 'AAAA.5', 'S5' ], [ 'AAAA.6', 'S6' ], [ 'AAAA.7', 'S7' ], [ 'AAAA.8', 'S8' ], [ 'AAAA.9', 'S9' ], [ 'AAAA.10', 'S10' ], [ 'AAAA.10', 'S11' ], [ 'AAAA.12', 'S12' ], [ 'AAAA.13', 'S13' ], [ 'AAAA.14', 'S14' ] ];

const searchValue = '10';

const output = arr.filter((item) => item.join('||').includes(searchValue) );
console.log(output)  

Если у вас есть объекты или вы предпочитаете вложенный цикл, вы также можете попробовать что-то вроде этого:

 var arr = [ [ 'AAAA.3', 'S3' ], [ 'AAAA.4', 'S4' ], [ 'AAAA.5', 'S5' ], [ 'AAAA.6', 'S6' ], [ 'AAAA.7', 'S7' ], [ 'AAAA.8', 'S8' ], [ 'AAAA.9', 'S9' ], [ 'AAAA.10', 'S10' ], [ 'AAAA.10', 'S11' ], [ 'AAAA.12', 'S12' ], [ 'AAAA.13', 'S13' ], [ 'AAAA.14', 'S14' ] ];

const searchValue = '10';

const output = arr.filter((item) => item.some((value) => value.includes(searchValue) ) );
console.log(output)  

Ответ №7:

Вы можете использовать filter для возврата нового массива и внутри filter обратного вызова проверить, заканчиваются ли внутренние элементы соответствующим значением, и использовать endsWith для этого.

Вы можете использовать, includes если хотите получить массив элементов, которые includes val находятся в любой позиции

Также обратите внимание, что это вернет, если оба элемента внутри вложенного массива имеют совпадающий символ, но если вы используете || вместо amp;amp; , это также вернет ['AAAA.10', 'S11']

 var arr = [
  ['AAAA.3', 'S3'],
  ['AAAA.4', 'S4'],
  ['AAAA.5', 'S5'],
  ['AAAA.6', 'S6'],
  ['AAAA.7', 'S7'],
  ['AAAA.8', 'S8'],
  ['AAAA.9', 'S9'],
  ['AAAA.10', 'S10'],
  ['AAAA.10', 'S11'],
  ['AAAA.12', 'S12'],
  ['AAAA.13', 'S13'],
  ['AAAA.14', 'S14']
]

function findNestArray(val) {
  return arr.filter(function(item) {
    if (item[0].endsWith(val)) {
      return item
    }
  })
}
console.log(findNestArray('10'))  

Ответ №8:

Попробуйте этот самый простой:

 var result = arr.filter(function(item){
    return item[0].includes(10);
})

console.log(result);
  

Метод filter проверяет каждый элемент массива. Затем возвращает элемент в соответствии с возвращаемым значением данной функции. Метод filter передает каждый элемент в качестве аргумента данной функции. Если функция возвращает значение true, элемент выбран. Метод includes проверяет, содержит ли строка 10. Вы можете использовать item[0].endsWith("10") для проверки 10 в последней позиции.