фильтрация массива JavaScript

250
22 августа 2018, 20:20

как отфильтровать один массив по значениям другого и не используемые значения вывести в другой массив - задача с codewars

function unusedDigits() { 
	let finArr = null; 
	let newArr = [...arguments].join(''); //массив вводных в строку 
	let sortArr = newArr.split(''); //в массив по одному элементу 
	console.log(sortArr); 
	let dfltArr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; //массив для фильтрации вводными 
 
	for (let i = 0; i < sortArr.length; i++) { 
		finArr = dfltArr.filter(function(elem) { 
       
			if (elem == sortArr[i]) { 
 
				return false; 
			} else { 
				return true; 
console.log('filter', elem); 
			} 
		}); 
	} 
	console.log(finArr); 
} 
unusedDigits(2015, 8, 26);

Answer 1

Ошибка заключается в теле цикла.

Переменная finArr постоянно переписывается, однако фильтруется, так же постоянно, только переменная dfltArr поэтому в итоге в finArr хранится результат фильтрации по последней цифре ввода.

Для решения нужно менять одну переменную. Например dfltArr

function unusedDigits() { 
  let newArr = [...arguments].join(''); //массив вводных в строку 
  let sortArr = newArr.split(''); //в массив по одному элементу 
  console.log(sortArr); 
  let dfltArr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; //массив для фильтрации вводными 
 
  for (let i = 0; i < sortArr.length; i++) { 
    dfltArr = dfltArr.filter(function(elem) { 
 
      if (elem == sortArr[i]) { 
        return false; 
      } else { 
        return true; 
      } 
    }); 
  } 
  console.log(dfltArr); 
} 
unusedDigits(2015, 8, 26);

Альтернативным решением может стать использование Set, для хранения уникальных входных элементов, тогда для фильтрации достаточно будет одного вызова filter в котором будет проверяться наличие элемента в Set.

Например:

function unusedDigits(...args) { 
  let newArr = new Set(args.join('')); //массив уникальных цифр 
  return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].filter(elem => !newArr.has(elem.toString())); 
} 
console.log(unusedDigits(2015, 8, 26));

Answer 2

Для разнообразия

function unusedDigits(){ 
	var azbuka = [0,1,2,3,4,5,6,7,8,9], string_ = Array.prototype.join.call(arguments) 
	for(var i = 0, length = string_.length; i < length; i++){azbuka[string_[i]] = undefined} 
	return Array.prototype.slice.call(azbuka.join("")) 
} 
	console.log(unusedDigits(2015, [8, 26]));

READ ALSO
Цикл для игры на JS

Цикл для игры на JS

Есть функция:

174
Где посмотреть исходный код запроса ajax?

Где посмотреть исходный код запроса ajax?

Не понимаю, сделал обычный ajax запрос, что бы подгрузилась разметка, в браузере всё отображается, что надо, а заглянул в исходный код, а там...

158
Добавить тект к google maps кластерам

Добавить тект к google maps кластерам

Делаю подключение к google maps все работает, но не могу понять как текс при наведении на кластер добавитьПотому как из бд данные подгружаются...

203
Поочередная заливка кнопок onClick [дубликат]

Поочередная заливка кнопок onClick [дубликат]

На данный вопрос уже ответили:

148