AlexLearne Ответов: 1

Удаление вхождения элемента происходит более n раз


Мне нужно было бы стереть значение, если оно превышает число n, например:
sortN([2, 3, 3, 3, 4, 4], 1);-> [2, 3, 4]

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

Что я уже пробовал:

Самое близкое, что я получил, - это подсчитать количество вхождений каждого элемента, например:
function compressArray(original) {
 
	var compressed = [];
	// make a copy of the input array
	var copy = original.slice(0);
 
	// first loop goes over every element
	for (var i = 0; i < original.length; i++) {
 
		var myCount = 0;	
		// loop over every element in the copy and see if it's the same
		for (var w = 0; w < copy.length; w++) {
			if (original[i] == copy[w]) {
				
				myCount++;
				
				delete copy[w];
			}
		}
 
		if (myCount > 0) {
		
			compressed.push(original[i], myCount);
		}
	}
 
	return compressed;
};

Это действительно полезно? Должен ли я использовать другой подход?

1 Ответов

Рейтинг:
6

Richard Deeming

Как насчет чего-то вроде этого:

function compressArray(original, maxOccurrences) {
    if (!original) { return null; }
    if (maxOccurrences < 1) { return []; }
    
    var result = [];
    var itemCounts = {};
    for (var index = 0; index < original.length; index++){
        var item = original[index];
        var count = itemCounts[item] || 0;
        if (count < maxOccurrences) {
            result.push(item);
            itemCounts[item] = count + 1;
        }
    }
    
    return result;
}

Демонстрация[^]


AlexLearne

Большое вам спасибо! Но поскольку я новичок, у меня есть несколько вопросов.Не могли бы вы помочь мне полностью понять код?
Что делает эта линия? var count = itemCounts[item] | / 0;
Вы добавляете значения к объекту?
Все равно спасибо!

Richard Deeming

Это сокращенный способ письма:

var count = itemCounts[item];
if (count === undefined) {
   count = 0;
}


Когда мы сталкиваемся с предметом, которого раньше не видели, itemCounts объект не содержит значения для этого элемента, поэтому itemCounts[item] возвращается undefined В таком случае мы хотим count должен быть установлен на 0- поскольку мы еще не видели этого предмета.

В if блок, мы тогда храним count + 1 против пункта в itemCounts объект. Это добавит новое значение, если ключ еще не существует, или обновит существующее значение, если оно существует.

AlexLearne

Спасибо! Отличная помощь!