Как написать функцию, которая выполняет итерацию по списку наборов элементов различного количества, извлекая последовательные массивы из 4 - PullRequest
0 голосов
/ 13 июля 2020

У меня есть длинный список наборов элементов разного количества. Для каждой строки я хочу извлечь только те наборы, которые содержат 4 или более элементов, и поместить их в отдельный массив. Если в наборе более 4 элементов, я хочу извлечь из них каждый набор из 4 элементов. например,

a,b,c 
a,b,c,d 
d,b,c,a
a,b,d,c,a,d
a,d

возвращает

result = [ [a,b,c,d], [d,b,c,a] , [a,b,d,c], [b,d,c,a], [d,c,a,d] ]

обратите внимание, что второй после последнего набор элементов создает 3 массива в конце массива результатов.

Как бы я пишу функцию / метод JS или Ruby, чтобы вернуть такой результат ??

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Решение Ruby: сначала выберите достаточно большие массивы, затем поместите в результат все последовательные серии из 4 элементов.

input = [['a','b','c'], ['a','b','c','d'], ['d','b','c','a'], ['a','b','d','c','a','d'], ['a','d']]

p input.select{|ar| ar.size >= 4}.flat_map{|ar| ar.each_cons(4).to_a }

# =>[["a", "b", "c", "d"], ["d", "b", "c", "a"], ["a", "b", "d", "c"], ["b", "d", "c", "a"], ["d", "c", "a", "d"]]
0 голосов
/ 13 июля 2020

Другое решение Ruby.

input = [['a','b','c'], ['a','b','c','d'], ['d','b','c','a'],
         ['a','b','d','c','a','d'], ['a','d']]

input.each_with_object([]) do |a,arr|
  a.each_cons(4) { |a4| arr << a4 } if a.size > 3
end
  #=> [["a", "b", "c", "d"], ["d", "b", "c", "a"], ["a", "b", "d", "c"],
  #    ["b", "d", "c", "a"], ["d", "c", "a", "d"]]

См. Enumerable # each_cons .

0 голосов
/ 13 июля 2020

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

const input = [['a','b','c'], ['a','b','c','d'], ['d','b','c','a'], ['a','b','d','c','a','d'], ['a','d']]
const result = []

input.forEach(arr => {
  if (arr.length === 4) {
    result.push(arr)
  } else if (arr.length > 4) {
    for (let i = 0; i < arr.length - 3; i++) {
      result.push(arr.slice(0 + i, 4 + i))
    }
  }
})

console.log('result = ', result)

//result = [ [a,b,c,d], [d,b,c,a] , [a,b,d,c], [b,d,c,a], [d,c,a,d] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...