整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

css文件可以删除吗?css文件删除了怎么找回来

css文件可以删除吗?css文件删除了怎么找回来

网页设计和开发的过程中,CSS(层叠样式表)文件扮演着至关重要的角色,它们负责为网页赋予样式和美感。然而,有时在整理项目文件或进行清理时,我们可能会考虑是否可以删除某些CSS文件。那么,CSS文件可以删除吗?如果不小心删除了CSS文件,我们又该如何找回呢?本文将探讨这些问题,并提供相应的解决方案。

图片来源于网络,如有侵权请告知

CSS是什么文件?

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于定义网页样式和布局的标记语言。CSS是一种简单的样式表语言,用于描述HTML或XML文档的外观和格式。通过CSS文件,可以设置网页的字体、颜色、边距、边框、背景等样式,使网页呈现出不同的视觉效果。CSS文件通常以.css作为文件扩展名。

图片来源于网络,如有侵权请告知

CSS文件可以删除吗?

CSS文件本身并不是网站运行所必需的,因为HTML文件本身也包含内联样式和基本的结构样式。但是,为了保持网站的外观和用户体验的一致性,我们通常会将样式定义在单独的CSS文件中。因此,从技术上讲,CSS文件可以被删除,但这会导致网页失去样式,变得难以阅读和使用。

CSS文件删除了怎么找回来?

怎么找回删除的CSS文件?这确实是一个令人头疼的问题。但别担心,只要采取正确的措施,还是有可能找回的。

首先,要立刻停止在CSS文件所在磁盘中进行任何新的操作,以防覆盖被删除的文件。接下来,可以尝试以下几种方法来找回CSS文件:

方案1、备份文件恢复

首先,检查您是否有备份。备份是防止数据丢失的最有效方法。如果您定期备份了网站文件,那么从备份中恢复CSS文件是最直接和可靠的方式。

图片来源于网络,如有侵权请告知

方案2、使用版本控制

如果你使用了版本控制工具(如Git),你可以轻松查看历史记录,找到被删除的文件,并将其恢复到最新版本。使用版本控制可以方便地追踪文件变更历史,是防止误删的重要措施。

方案3、从回收站中还原

如果CSS文件是在本地计算机上被删除的,检查回收站,看看是否有该文件。要检查您的回收站是否包含被删除的CSS文件,您可以按照以下步骤进行操作:

1)在计算机桌面上找到回收站图标,并双击打开它。

2)在回收站窗口中,您可以查看所有最近删除的文件和文件夹。

3)如果找到了CSS文件右键单击,选择“还原”即可将其恢复到原来的位置。

方案4、使用数据恢复软件

如果回收站也被清空,CSS文件删除了还能恢复吗?您可以尝试使用数据恢复软件。软件可以扫描硬盘,尝试找回被删除的文件。但请注意,任何数据恢复软件都无法百分百恢复,因此建议优先使用支持免费扫描和预览的软件进行预判。

下面以云骑士数据恢复软件为例进行操作:

1)在官网下载软件并按提示安装在电脑上,启动后选择相应的恢复模式,如场景模式中的“误删除文件”。

2)接着在界面右侧选择CSS文件原本所在磁盘,勾选后点击右下角的“开始扫描”按钮,等待软件自动扫描结束。

3)扫描完成后,如果有太多的结果,建议在文档文件类型下查找CSS格式的文件,或者搜索文件名等方式缩小查找范围,然后预览找到的文件。

4)最后将预览无误的CSS文件(能看到文字)勾选上,点击“立即恢复”按钮,将文件另存到其他磁盘中进行查看即可。

方案5、寻求专业帮助

如果以上方法都无法找回CSS文件,如您的电脑出现物理性故障、无法开机或者蓝屏等情况,建议您寻求线下专业人员的帮助来恢复丢失的文件。

图片来源于网络,如有侵权请告知

CSS文件相关问答

CSS文件覆盖之后能恢复吗?

一旦文件被覆盖,通常情况下是无法完全恢复原始文件的。当文件被覆盖时,原始数据会被新数据所替代,导致原始文件的内容无法被完整恢复。虽然数据恢复软件有时可能能够部分恢复被覆盖的文件的一些片段或碎片,但是恢复的成功率通常较低。

总结:

CSS文件虽然可以被删除,但删除它们通常会导致网站失去样式和美观性,影响用户体验。因此,在删除任何文件之前,都应该仔细考虑其影响。如果不幸删除了CSS文件,可以通过上述介绍的方法尝试找回。但最好的做法始终是预防,如果所有方法都无法找回文件,重新编写样式可能是最后的解决方案。

往期推荐:

js文件删除了怎么恢复?找回方法与预防措施

「2024指南」tf卡格式化了数据怎么恢复?

chkdsk修复会造成文件丢失吗?chkdsk数据丢失还能恢复吗

日常编程中,我们经常会遇到数组去重的问题。今天,我们就来聊聊如何用JavaScript来优雅地解决这个问题。

问题描述

给定一个包含重复元素的数组,我们希望创建一个新的数组,其中只包含原始数组中的唯一值。例如,如果我们有一个数组 [1, 2, 3, 2, 4, 1, 5],期望的输出应该是 [1, 2, 3, 4, 5]

方法一:最原始的方法

我们可以使用最简单的方法——嵌套循环来解决这个问题。遍历每一个元素,检查它是否已经存在于新数组中,如果不存在则添加进去。

function removeDuplicates(arr) {
  const result=[];
  for (let i=0; i < arr.length; i++) {
    let isDuplicate=false;
    for (let j=0; j < result.length; j++) {
      if (arr[i]===result[j]) {
        isDuplicate=true;
        break;
      }
    }
    if (!isDuplicate) {
      result.push(arr[i]);
    }
  }
  return result;
}
const myArray=[1, 2, 3, 2, 4, 1, 5];
const uniqueArray=removeDuplicates(myArray);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

这个方法虽然直观,但当数组很大时,效率会变得非常低,因为时间复杂度是 O(n2)。

方法二:使用indexOf和filter方法

我们还可以使用 indexOf 方法配合 filter 方法来去重,这样看起来会简洁不少。

function removeDuplicates(arr) {
  return arr.filter((item, pos)=> arr.indexOf(item)===pos);
}
const myArray=[1, 2, 3, 2, 4, 1, 5];
const uniqueArray=removeDuplicates(myArray);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

在这个方法中,我们使用 filter 方法创建了一个新数组,只有满足条件的元素才会被包含进来。条件是当前元素的索引应该等于该元素在数组中第一次出现的位置。这种方法代码看起来更简洁,但是它的时间复杂度依然是 O(n2),因为 indexOf 需要遍历整个数组来查找元素的位置。

使用对象特性优化

在处理大数组去重时,我们可以利用对象的特性来提升性能。通过在对象中记录数组元素,可以有效减少重复元素的检查次数。

function removeDuplicates(arr) {
  const seen={};
  return arr.filter((item)=> {
    if (seen[item]) {
      return false;
    } else {
      seen[item]=true;
      return true;
    }
  });
}
const myArray=[1, 2, 3, 2, 4, 1, 5];
const uniqueArray=removeDuplicates(myArray);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

这个方法创建了一个空对象 seen,然后通过 filter 方法遍历数组。每个元素都会检查是否已存在于 seen 对象中。如果存在,则跳过;否则,加入 seen 对象并保留在新数组中。这种方法对于大数组更高效,但存在一些缺点:

  • 类型转换:对象键只能是字符串或符号,这导致数字和字符串形式的数字无法区分。例如,removeDuplicates([1, "1"]) 会返回 [1]。
  • 对象相等性:所有对象在这个解决方案中被认为是相等的。例如,removeDuplicates([{foo: 1}, {foo: 2}]) 会返回 [{foo: 1}]。

如果你的数组只包含基本类型,并且不需要区分类型,这可以放心使用这个方法。

结合对象和数组的线性搜索

我们可以结合对象和数组的线性搜索方法来解决上述问题。

function removeDuplicates(arr) {
  const prims={ boolean: {}, number: {}, string: {} };
  const objs=[];
  return arr.filter((item)=> {
    const type=typeof item;
    if (type in prims) {
      if (prims[type].hasOwnProperty(item)) {
        return false;
      } else {
        prims[type][item]=true;
        return true;
      }
    } else {
      if (objs.indexOf(item) >=0) {
        return false;
      } else {
        objs.push(item);
        return true;
      }
    }
  });
}
const myArray=[1, 2, 3, 2, 4, 1, 5, { foo: 1 }, { foo: 2 }];
const uniqueArray=removeDuplicates(myArray);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5, { foo: 1 }, { foo: 2 }]

主要优点

  • 分类存储:通过将基本类型和对象类型分别存储,减少了不同类型之间的冲突,逻辑清晰。
  • 高效处理基本类型:使用对象存储基本类型,查找和存储操作的时间复杂度为 O(1),效率较高。

存在的问题

  • 1、对象类型处理问题:
    • 引用比较:代码使用 indexOf 方法判断对象是否存在于数组中,这实际上是比较对象的引用而不是内容。即使两个对象内容相同,但引用不同,indexOf 也会返回 -1,导致内容相同但引用不同的对象被认为是不同的。例如,{ foo: 1 } 和另一个 { foo: 1 } 会被当作两个不同的对象。
    • 性能问题:对于大量对象类型的元素,由于 indexOf 方法需要遍历整个数组,时间复杂度为 O(n),性能较差。
  • 2、不能深度比较:对于嵌套对象或数组,该方法无法进行深度比较。例如,{ foo: [1, 2] } 和 { foo: [1, 2] } 这样的对象,内容相同但引用不同,会被认为是不同的对象。

最终方案:编写深度比较函数

编写深度比较函数 isDeepDataStructureEquality,用来比较两个对象的内容是否相同。

function isDeepDataStructureEquality(a, b) {
    let isEqual=Object.is(a, b);

    if (!isEqual) {
      if (Array.isArray(a) && Array.isArray(b)) {

        isEqual=(a.length===b.length) && a.every(
          (item, idx)=> isDeepDataStructureEquality(item, b[idx])
        );
      } else if (
        a && b
        && (typeof a==='object')
        && (typeof b==='object')
      ) {
        const aKeys=Object.keys(a);
        const bKeys=Object.keys(b);

        isEqual=(aKeys.length===bKeys.length) && aKeys.every(
          (key, idx)=> isDeepDataStructureEquality(a[key], b[key])
        );
      }
    }
    return isEqual;
  }

function removeDuplicates(arr) {
  const primitives={ boolean: {}, number: {}, string: {} };
  const objs=[];
  return arr.filter(item=> {
    const type=typeof item;
    if (type in primitives) {
      if (primitives[type].hasOwnProperty(item)) {
        return false;
      } else {
        primitives[type][item]=true;
        return true;
      }
    } else {
      if (objs.some(obj=> isDeepDataStructureEquality(obj, item))) {
        return false;
      } else {
        objs.push(item);
        return true;
      }
    }
  });
}

方法三:排序去重

另一种去重方法是先排序数组,然后去除连续重复的元素。

function removeDuplicates(arr) {
  return arr.sort().filter((item, pos, ary)=> !pos || item !==ary[pos - 1]);
}
const myArray=[1, 2, 3, 2, 4, 1, 5];
const uniqueArray=removeDuplicates(myArray);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

这个方法首先使用 sort 方法对数组进行排序,然后使用 filter 方法去除连续的重复元素。虽然对已排序的数组很有效,但无法处理对象数组。

方法四:使用 Set 处理对象

对于包含对象的数组,我们可以利用 Set 数据结构来高效去重。因为 Set 只存储唯一值,我们可以将数组转换为 Set,然后再转换回数组。

function removeDuplicates(arr) {
  return [...new Set(arr)];
}
const myArray=[1, 2, 3, 2, 4, 1, 5, { foo: 1 }, { foo: 2 }];
const uniqueArray=removeDuplicates(myArray);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5, { foo: 1 }, { foo: 2 }]

这个方法通过 new Set(arr) 创建一个新的集合,然后使用扩展运算符 ... 将集合展开为数组,去重过程简单且高效。

  • 优点
    • 简洁:代码非常简洁,只需一行代码即可实现数组去重。
    • 高效:Set 数据结构在插入元素时自动去重,性能较好,时间复杂度为 O(n)。
  • 存在的问题
    • 对象引用问题:Set 判断元素是否相等时,使用的是同一对象引用。例如,两个内容相同但引用不同的对象 { foo: 1 } 和 { foo: 1 } 会被视为不同的元素。

总结

在实际开发中,选择合适的数组去重方法非常重要。如果数组主要包含基本类型,使用 Set 是一种简洁高效的选择。如果数组中包含复杂结构的对象,可以结合深度比较函数来确保去重的准确性。

无论你选择哪种方法,都要根据具体的应用场景和数据特点来决定。希望这些方法能帮助你在实际开发中更优雅地解决数组去重问题。如果你有其他更好的方法或建议,欢迎在评论区分享哦!

如果你喜欢这篇文章,请点赞并关注,更多前端技巧和小妙招等着你哦!


面文章,实现了通过表单完成数据的录入,并写入数据库。接下来实现数据的修改和删除。

首先找到user_manager.html文件,增加修改和删除的按钮。

找到显示数据的表格<table>标签,在表头区域增加一列<th>操作</th>,然后在显示数据的for循环中增加一个<td></td>标签,在标签内增加两个连接<a>标签,href先设置为空,各增加一个class样式。如图所示:

刷新user_manager.html页面,如下图。现在按钮已经添加到前端页面。

接下来,完善删除功能。

先在views.py中建立一个删除的方法,如下。方法传入两个参数,一个request,一个需要删除行的id,使用User类的filter功能在数据库中查找数据,使用delete()方法删除数据,最后返回user_manager页面。

def user_delete(request,user_id):
    User.objects.filter(id=user_id).delete()
    return redirect("/user_manager/")

接下来增加路由,以在前端调用该方法删除数据。打开urls.py文件,新增加一个删除数据的路由。

在前端user_manager.html页面中,增加删除的href如下:

试验一下删除功能,打开user_manager.html页面,找到第一条数据,

点击删除按钮,第一条数据已被删除。

下篇笔记,将记录如何实现修改数据的功能。