как найти полную строку строк 2d массива? - PullRequest
0 голосов
/ 20 июня 2019

как получить количество строк, которое не содержит 0?

эта попытка возвращает только количество столбцов, но мне нужны строки:

var items = [
      [1, 0,1],
      [3, 3,3],
      [5, 6,5]
    ];
    let result=[]
    function h(list){
    for(let i = 0; i < list.length; i ++){
      for(let j = 0; j < list.length; j ++)
    {
      if(list[i][j]!= 0)
    result.push(j)

    }
    return result;
    }

    }
    console.log(h(items))

результат должен быть [1,2] количество строк

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Это довольно простая версия:

const h = items => items
  .map ( (_, i) => i )
  .filter ( i => ! items [i] .some (x => x == 0) )

var items = [ [1, 0, 1], [3, 3, 3], [5, 6, 5] ];

console .log (
  h (items)
)

Вызов map превращает внешний список в список индексов.

Затем вызывается filter с использованием some, чтобы определить,любой из элементов в строке с этим индексом имеет значение 0.

Если вы хотите, чтобы фактические строки, а не их индексы, было бы проще: const h = items => items .filter (row => ! row .some (x => x == 0)).

Обновление

Из комментария ниже:

Не могли бы вы упростить синтаксис?:(

Ну нет, не совсем. Это уже довольно просто. Мы, вероятно, должны что-то исправить. Мы злоупотребляем map здесь. Было бы лучше зависеть от функции rangeнапример:

const range = (lo, hi) => Array .from ( {length: hi - lo}, (_, i) => i )

Идея здесь в том, что range(3, 10) даст [3, 4, 5, 6, 7, 8, 9] (все целые числа, начиная с lo до, но не включая hi.

Итогда мы могли бы использовать это так:

const h = (items) => 
  range (0, items.length)
  .filter ( i => ! items [i] .some (x => x == 0) )

Это не делает ничего более простым, только перестраивает сложность. Однако, стоит , и это лучшая версия.

Мы также можем изменить функцию, которую мы передаем, на filter. Вместо

  .filter ( i => ! items [i] .some (x => x == 0) )

мы могли бы легко написать:

  .filter ( i => items [i] .every (x => x != 0) )

Возможно, будет немного легчеобратите внимание на знак not-equal, чем на отдельный not. Это простой вопрос вкуса, а не фундаментальный. Каждый одинаково прост.

Мы, вероятно, не можем сделать это намного проще, впо крайней мере, не в Javascript. Боюсь, что вы просите, чтобы это было более знакомым для вас.ich Классический доклад Хикки Simple Made Easy объясняет, что сложность заключается в том, чтобы сплетать воедино отдельные проблемы.Конечно, простота противоположна, но мы часто путаем это с «легким».Это очень четкое понятие, гораздо более субъективное и не очень хорошее для программного обеспечения.

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

Использование выражений функций

Первый шаг - просто заменить эти новые функции со стрелками на выражения старой школы

const h = function (items) {
  return items.map (function (item, index) {
    return index;
  })
  .filter (function (index) {
    return ! items [index] .some (function(value) {
      return value == 0;
    })
  })
}

В этой версии добавлено ключевое слово function и return, а также изменено тело с одним выражением на { /*...*/ }.Это добавляет много визуального беспорядка, никоим образом не уменьшая сложность.

Но не волнуйтесь, мы можем легко сделать это еще хуже.

Обратите внимание, что внешняя оболочка функции все ещеодно выражение, структуры как (input).map(someFunction).filter(anotherFunction).Мы не оставили нам места для простого добавления оператора отладки.Более того, даже если бы у нас была такая возможность, у нас все еще нет именованных промежуточных переменных для записи.

Давайте исправим это, не так ли?

Именование промежуточных значений

Этоверсия позволяет нам добавить очень важный оператор console.log в середине нашей обработки:

const h = function (items) {
  const indices = items .map (function (item, index) {
    return index;
  });
  // console.log(`Indices found`, indices);
  const noZeroesIndices = indices .filter (function (index) {
    return ! items [index] .some (function(value) {
      return value == 0;
    });
  })
  return noZeroesIndices;
}

Мы определенно отходим от простоты здесь.Мы только что ввели новую технику в нашу кодовую базу: назначение переменных .

Переход к одному циклу

Но мы еще не закончили.Мы также должны серьезно подумать о потенциальных проблемах производительности.Наша техника включает в себя циклическое повторение строк дважды, один раз, чтобы найти индексы, а затем использовать их.Если бы он занимал десятки миллионов строк, это могло бы занять несколько миллисекунд дольше, чем если бы мы делали эти шаги одновременно.Очевидно, что здесь есть некоторая неэффективность, которую следует немедленно устранить. 1

Тем временем парень в коридоре сказал нам, что .map и .filter менее эффективны, чем простые петли for.Это должно быть верно и для .some.Поэтому, пока мы заменяем эту дополнительную итерацию, мы можем перейти к for циклам.Это будет означать введение некоторых дополнительных переменных.Но это все в хорошем деле.Итак, вот во всем этом ... хм, красота:

const h = function (items) {
    const noZeroesIndices = [];
    for (let rowIndex = 0; rowIndex < items.length; rowIndex++) {
        const row = items[rowIndex]
        let anyZeros = false
        for (let index = 0; index < row.length; index++) {
            if (row[index] === 0) {
                anyZeros = true;
                break;
            }
        }
        if (!anyZeros) {
            noZeroesIndices.push(rowIndex)
        }
    }
    return noZeroesIndices;
}

Заключение

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


1 Это должно быть очень шутливо.Пожалуйста, не оптимизируйте производительность, добавляя сложность к своему коду, если вы не профилировали и не можете продемонстрировать, что этот конкретный раздел является одним из реальных узких мест, вызывающих недопустимые скорости выполнения.

0 голосов
/ 20 июня 2019

Попробуйте этот код:

var items = [
    [1, 0, 1],
    [3, 3, 3],
    [5, 6, 5]
];

function h(list) {
    let result = []; // result variable should be in the function
    for (let i = 0; i < list.length; i++) {
        for (let j = 0; j < list.length; j++) {
            if (list[i][j] !== 0)
                result.push(list[i][j]) // push value not key
        }
        // here is not place for return
    }
    return result;
}

console.log(h(items));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...