Найти значения в подмассиве

413
03 мая 2017, 11:14

Есть массив section = [[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]]; И массив numbers = [2,3,5,8,10,14,15];

Как определить, какие числа из numbers есть в подмассиве section в количестве более, чем 1 шт.? Например, числа 10, 14 есть в подмассиве section[2], т.е. [2, 6, 10, 14].

Пробовал так:

let result = [];
                    for (let a = 0; a < section.length; a++) {
                        let arr = [];
                        for (let i = 0; i <= numbers.length; i++) {
                            if (section[a].includes(numbers[i])) {
                                arr.push(numbers[i])
                            }
                        }
                        if(arr.length>1) {
                             result.push(arr);
                         }
                        console.log(result)
                    }

Не сработало. Как это можно сделать?

Answer 1

не знаю, тут, мне кажется, даже рекурсия не нужна.

const section = [[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]]; 
const numbers = [2,3,5,8,10,14,15]; 
 
const result = section 
  .map(subs => // map сделает новый массив где значениями  будут пересечения значений numbers и подсекции 
      subs.filter(number=>numbers.includes(number)) // просто удалим все значения не входящие в numbers из subs, вернем 
  ).filter(r => r.length>1); //я правильно понимаю, что нужно удалить пустые массивы ? (тут же проверим что длина >1) 
console.log(result);

оставлю для истории, если нужен вдруг список чисел все таки

const section = [[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]]; 
const numbers = [2,3,5,8,10,14,15]; 
const result = new Set(); //без Set придется проверять наличие в результатах или держать объект вида {number: true} 
 
for (let subs of section) { 
  let found = subs.filter(number=>numbers.includes(number)); 
  if (found.length>1) { 
    found.forEach(number=>result.add(number)); 
  } 
} 
console.log(Array.from(result));

Answer 2

var section = [[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]];  
var numbers = [2,3,5,8,10,14,15]; 
 
function diff(sourceArr, compareArr) { 
    return sourceArr.filter(function(i) { 
      return compareArr.indexOf(i) != -1; 
    }); 
} 
 
var output = []; 
for (let i = 0; i < section.length; i++) {  
  var diffArr = diff(section[i], numbers); 
  output.push( diffArr.length > 1 ? diffArr : [] );   
} 
 
console.log(output);   

функция diff - для определения совпадения элементов массивов, в котором фильтруем элементы, если они не совпали по условию indexOf(i) != -1, где indexOf - возвращает индекс первого вхождения указанного значения в объект и возвращает -1, если значение не найдено.

Далее в цикле к каждому подмассиву section применяем функцию. И если количество совпавших элементов >1, то заносим его в output, если нет - то заносим пустой массив (если это нужно);

Answer 3

Я тоже не совсем всё понял в твоей задаче. Например, ты пишешь что в количестве более, чем 1 шт. - это значит 2, 3, и т.д., но тебе ведь, судя по примеру, и одно вхождение подходит? Также не понял зачем ты во втором цикле ставишь меньше или равно:

i <= numbers.length

По-моему знака меньше тут достаточно. Ну и вот попробуй решение:

section = [[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]]; 
numbers = [2,3,5,8,10,14,15];
var result = [];
for (let a = 0; a < section.length; a++) {
  let arr = [];
  for (let i = 0; i < numbers.length; i++) {
    let arrStr = ',' + section[a].join() + ',';
    let numbStr =  ',' + numbers[i] + ',';
    if ( ~arrStr.indexOf( numbStr )  ) {
      arr.push(numbers[i])
    }
  }
  arr.length &&  result.push(arr);
}
console.log(result);
READ ALSO
Не могу понять кусок кода

Не могу понять кусок кода

Решил разобрать маленький фреймворк Sortable (для сортировки элементов на странице) и не могу понять небольшой кусок кода

407
БЭМ Не актуальная документация

БЭМ Не актуальная документация

Документация по синтаксису шаблонов, шаблонизатора bem-xjst, предикатыК первому подпредикату показан и объяснен пример, который не работает

276
Как начать массив в js с 1

Как начать массив в js с 1

То есть мне нужно что бы массив в js начинался не с 0, а с 1При этом не удаляю никаких элементов

313