Поиск и подсчет, сколько раз конкретная команда появляется в массиве

1

Я искал и ничего не нашел. Вот как выглядит мой тестовый пример:

console.log(specificSearch([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ], 'even')); // the maximum number of even numbers is in row - 2, which are 2 and 8

  console.log(specificSearch([
  ['o', 'o', 'o', 'x'],
  ['x', 'x', 'o'],
  ['o', 'x'],
  ['x', 'x', 'x', 'x', 'x', 'x', 'x']
  ], 'x')); // the maximum number of x is in column - 4, which is 7 times appear

и это мой код до сих пор:

function specificSearch(array, command) {

    var max = 0
    var even = 0
    for(var i = 0; i < array.length; i++){
      var evenCounter = 0
       for(var j = 0; j < array[i].length; j++){
          if(command === 'even'){
             if(array[i][j] % 2 == 0){
                evenCounter++
             }
          } 
       }

       if(command === 'even' ){
         if( max < evenCounter) {
           max = evenCounter
           even = i
         }
       }
    }
    return even
  }

что, когда я пытаюсь найти четное число, если он ищет номер, то он должен возвращать в строке и какое число, но с другой стороны, если он не ищет номер и длина массива не совпадает, то он должен вернуться в каком столбце и сколько раз появляется. В этом случае не требуется встроенная функция, такая как регулярное выражение, карта, фильтр, индекс, просто используйте циклы и операции с массивами, такие как push, pop, shift и т.д.

Спасибо за вашу помощь, я просто нуб, который пытается выучить код :)

  • 0
    пожалуйста, добавьте желаемый результат. Вы хотите получить строку / столбец и количество? что произойдет, если количество в строке / столбце будет равным?
Теги:
arrays
multidimensional-array

2 ответа

1
Лучший ответ

Вы можете передать функцию для проверки определенного значения и вернуть логическое значение для проверки.

  • even взять

    x => !(x % 2)'
    
  • для проверки личности взять

    x => x === 'x'
    

Затем вы можете собрать все значения в массивах строк и столбцов, а затем получить максимальное значение и вернуть из массивов rows/cols индексы с максимальным значением.

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

Кстати, этот ответ использует индексы, как они работают в Javascript, начиная с нуля. Если вам нужно начать с одного, просто добавьте один к каждому индексу.

function specificSearch(array, checkFn) {

    function getIndices(array, value) {
        var i, indices = [];
        for (i = 0; i < array.length; i++) {
            if (array[i] === value) indices.push(i);
        }
        return indices;
    }

    var i, j,
        rows = [],
        cols = [],
        max;

    for (i = 0; i < array.length; i++) {
        for (j = 0; j < array[i].length; j++) {
            if (checkFn(array[i][j])) {
                rows[i] = (rows[i] || 0) + 1;
                cols[j] = (cols[j] || 0) + 1;
            }
        }
    }
    max = Math.max(...cols, ...rows);
    return { max, rows: getIndices(rows, max), cols: getIndices(cols, max) };
}

console.log(specificSearch([[1, 2, 3], [4, 5, 6], [7, 8, 9]], x => !(x % 2)));
console.log(specificSearch([['o', 'o', 'o', 'x'], ['x', 'x', 'o'], ['o', 'x'], ['x', 'x', 'x', 'x', 'x', 'x', 'x']], x => x === 'x'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
  • 0
    спасибо, ваш код легко понять.
1

Этот случай не нуждается в встроенной функции

Обычно, когда вы хотите превратить массив в одно значение, вы используете Array.prototype.reduce

const specificSearch = (array, comparer) =>
  array.reduce((highest, items) => {
    //reduce to highest number
    const current = items.reduce(
      //reduce to number
      //if comparer returns true for item add 1 to sum
      (sum, item) => (comparer(item) ? sum + 1 : sum),
      0,//start with sum of 0
    );
    //if current result is higher than highest so far
    //  return current, else return highest
    return current > highest ? current : highest;
  }, 0/** start with highest value of 0 */);

console.log(
  "max times even in item array",
  specificSearch(
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
    (x) => x % 2 === 0,
  ),
);

console.log(
  "max times value of 'x' in item array",
  specificSearch(
    [
      ['o', 'o', 'o', 'x'],
      ['x', 'x', 'o'],
      ['o', 'x'],
      ['x', 'x', 'x', 'x', 'x', 'x', 'x'],
    ],
    (x) => x === 'x',
  ),
);

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

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

  • 0
    спасибо, еще один вариант, если я использую встроенную функцию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню