javascript - renameFiles - 获取文件名数组并根据它们在数组中出现的次数重命名它们

标签 javascript arrays filter jasmine frequency

对于这个编码挑战,我们的想法是根据文件在数组中出现的次数来重命名文件。项目的第一个实例不需要重命名。

所以我们期望

['myFile', 'anotherFile', 'family-picture', 'myFile', 'another-file', 'myFile']

等于

['myFile', 'anotherFile', 'family-picture', 'myFile(1)', 'anotherFile(1)', 'myFile(2)']

到目前为止我已经创建了:

function renameFiles (array) {
	let map = {};
	let final = [];
	array.forEach((value) => {
		if (!map[value]) {
			map[value] = 0;
		}
		map[value] += 1;
	});
	let dups = [];
	for (let key in map) {
		if (map[key] > 1) {
			let count = map[key];
			while (count > 0) {
				dups.push(key);
				count--;
			}
		}
	}
	if (!dups.length) {
		return array;
	}
	let dupNumber = dups.length - 1;
	while (dupNumber >= 0) {
		for (let i = array.length; i >= 0; i--) {
			if (dups.includes(array[i])) { 
				final.unshift(array[i] + '(' + dupNumber + ')');
				dupNumber --;
			} else {
				final.unshift(array[i]);
			}
		}
	}
	final = final.filter((element) => element !== undefined);
	return final.map((element) => element.replace('(0)', ''));
}

console.log(renameFiles(['myFile', 'anotherFile', 'family-picture', 'myFile', 'another-file', 'myFile']));

除了挑战中的最后一个测试规范之外,这是有效的 - 如果原始列表中已存在该数字,我们需要在最终列表中的项目后面添加数字。

即我们预计

['a(1)', 'a(6)', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',];

等于

['a(1)', 'a(6)', 'a', 'a(2)', 'a(3)', 'a(4)', 'a(5)', 'a(7)', 'a(8)', 'a(9)', 'a(10)', 'a(11)',]

那么对于这个问题,也许有比我创建的方法更好的初始方法?

这是一个pastebin本次挑战的 Jasmine 测试规范。

还有一个 JSFiddle,我在其中输入了测试规范,但我不知道如何将其他窗口中的 HTML 或 CSS 更改为 JS。

最佳答案

如果您执行一次reduce来计算每个数字的数量,然后当您迭代以附加数字时,跟踪从0开始的偏移量,当找到相同的值时以及每当已经尝试使用名称时,该偏移量都会增加,会怎么样?存在吗?

注意:由于需要从 1 开始,所以它对偏移量有点挑剔,但前提是有 2 个或更多,但这似乎有效:

function renameFiles(array) {
    const offsets = {};
    const counts = array.reduce((countObj, fn) => {
        countObj[fn] = (countObj[fn] || 0) + 1;
        offsets[fn] = 0;
        return countObj;
    }, {});

    return array.map(val => {
        ++offsets[val];
        while (offsets[val] > 1 && array.includes(`${val}(${offsets[val] - 1})`)) {
            ++offsets[val];
        }
        return offsets[val] === 1 ? val : `${val}(${offsets[val] - 1})`;
    });
}

关于javascript - renameFiles - 获取文件名数组并根据它们在数组中出现的次数重命名它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57732937/

相关文章:

javascript - 错误: bundling failed: TypeError: Cannot read property 'transformFile' of undefined, react native

javascript - firebase.auth().setPersistence 错误 'Persistence' 未定义

Java 文件转二维数组

java - session 属性从过滤器传递到 servlet 的机制是什么?

JQuery 不会使用值进行过滤

javascript - 如何在 javascript 或 jquery 中使用变量作为数组键

php - JavaScript 促进了 OpenID 登录?

java - 关于数组和文件处理的一些事情

c++ - 将 char[][] 转换为 char**

linux - 是否可以从日志中删除一些键值对?