数组排序的五常见方式

1.Js中的sort()方法

基本思想:根据提供的排序规则,对数组元素进行排序。使用数字排序,必须通过一个函数作为参数来调用。

var arr = [123,203,23,13,34,65,65,45,89,13,1];
function func(a,b){
	return a-b;
}
console.log(arr.sort(func)); //(11) [1, 13, 13, 23, 34, 45, 65, 65, 89, 123, 203]

2.选择排序

基本思想:首先在未排序数组中找到最小(大)元素,存放在数组的起始位置。
再从剩余数组元素中继续寻找最小(大)元素,返回放在已排序数组的末尾重复第二步,直到所有元素都排序完成
动画演示:
在这里插入图片描述

var arr = [123,203,23,13,34,65,65,45,89,13,1];
for(var i=0;i<arr.length;i++){
	for(var j=i+1;j<arr.length;j++){
		//如果第一个比第二个大,就交换他们两个位置
		if(arr[i]>arr[j]){
			var temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}
}
console.log(arr); //(11) [1, 13, 13, 23, 34, 45, 65, 65, 89, 123, 203]

3.冒泡排序

基本思想:一次比较两个相邻的数,如果不符合规则互换位置,一次比较就能够将最大或最小的值放在数组最后一位继续对除【最后一位】之外的所有元素重复上述过程
动画演示:
在这里插入图片描述

var arr = [123,203,23,13,34,65,65,45,89,13,1];
for(var i=0; i<arr.length-1; i++){
	//每一轮比较要比多少次
	for(var j=0; j<arr.length-1-i; j++){
	    //如果第一个比第二个大,就交换他们两个位置
	    if(arr[j]>arr[j+1]){
	        var temp = arr[j];
	        arr[j] = arr[j+1];
	        arr[j+1] = temp;
	    }
	}    
}
console.log(arr); //(11) [1, 13, 13, 23, 34, 45, 65, 65, 89, 123, 203]

4.插入排序

基本思想:将数组第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。
动画演示:

在这里插入图片描述

var arr = [123,203,23,13,34,65,65,45,89,13,1];
var preIndex, current;
for(var i=1;i<arr.length;i++){
	preIndex = i-1;
	current = arr[i];
	while(preIndex>=0 && arr[preIndex]>current) {
	    arr[preIndex+1] = arr[preIndex];
	    preIndex--;
	}
	arr[preIndex+1] = current;
}
console.log(arr); //(11) [1, 13, 13, 23, 34, 45, 65, 65, 89, 123, 203]

5.快速排序(依托递归函数)

基本思想:在已知数据集合中随便去一个基准(pivot)将其余数据以基准为中心,大于分放右边,小于的放左边将左右两个子集重复以上两个步骤
动画演示:
在这里插入图片描述

var arr = [123,203,23,13,34,65,65,45,89,13,1];	
//创建快速排序函数
function quickSort(tempArr){
	//递归终止条件
	if(tempArr.length<=1){
		return tempArr;
	};
	//取基准
	var pivotIndex = Math.floor(tempArr.length/2);
	var pivot = tempArr.splice(pivotIndex,1);
	//分左右
	var leftArr = [];
	var rightArr = [];
	for(var i=0;i<tempArr.length;i++){
		if(tempArr[i]>pivot){
			rightArr.push(tempArr[i]);
		}else{
			leftArr.push(tempArr[i]);
	    };
	};
	return quickSort(leftArr).concat(pivot,quickSort(rightArr));
};
console.log(quickSort(arr)); //(11) [1, 13, 13, 23, 34, 45, 65, 65, 89, 123, 203]
<think>好的,用户之前问了关于扣子智能体支持的文件格,现在他想知道如何将整站资源下载并转化为JSON格。首先,我需要理解他的具体需求。他可能希望将整个网站的内容,包括HTML、图片、文本等,下载下来,然后转换成结构化的JSON数据,可能是为了导入到扣子智能体或其他系统中使用。 接下来,我需要考虑用户可能的背景。他可能不是技术专家,所以步骤需要详细但不过于复杂。之前的回答里提到了JSON的使用场景,比如复杂结构化数据,所以用户可能已经了解JSON的优点,现在需要实际操作的步骤。 用户的问题可以分为两部分:下载整站资源和转化为JSON。下载整站资源可能涉及使用工具,比如wget或HTTrack,这些工具的使用方法需要简明扼要地说明。然后,转化过程可能需要编写脚本,比如用Python解析HTML并提取数据,生成JSON。用户可能没有编程经验,所以需要给出示例代码,并建议使用可视化工具作为替代方案。 另外,需要注意潜在的问题。比如,下载网站时是否有权限,是否遵守robots.txt,处理动态内容时的困难,以及数据清洗的复杂性。用户可能没有考虑到这些,所以需要在步骤中提醒注意事项,避免他们遇到问题。 还要考虑用户可能需要的后续步骤,比如数据验证和导入到扣子智能体,这在之前的回答中提到过,可以在这里呼应,确保流程完整。同时,推荐一些工具和库,比如BeautifulSoup,pandas,或者可视化工具,让用户有更多选择。 最后,确保回答结构清晰,分步骤讲解,并给出示例,这样用户即使没有技术背景也能跟着操作。同时,强调注意事项,帮助用户避免常见陷阱,确保他们能够顺利完成整个流程。</think>--- ### 将网站整站资源下载并转化为JSON格的完整流程 --- #### **一、整站资源下载** 需使用工具完整抓取网站内容(HTML、图片、文本等),以下是两种常用方法: --- ##### **方法1:命令行工具(如 `wget`)** **步骤说明**: 1. **安装wget** - Windows:从 [GNU Wget官网](https://eternallybored.org/misc/wget/)下载 - macOS/Linux:终端执行 `brew install wget` 或 `sudo apt-get install wget` 2. **下载整站** ```bash wget \ --recursive \ # 递归下载 --no-clobber \ # 避免重复覆盖文件 --page-requisites \ # 下载图片/CSS/JS等依赖资源 --html-extension \ # 强制保存为.html --convert-links \ # 转换链接适配本地浏览 --restrict-file-name=unix \ # 文件名规范化 --domains example.com \ # 限制域名范围 --no-parent \ # 不下载上级目录 https://example.com ``` 3. **输出结果** - 网站内容会保存在 `example.com` 目录中 - 包含完整HTML、图片、CSS/JS等资源 --- ##### **方法2:可视化工具(如 `HTTrack`)** **操作流程**: 1. 下载HTTrack:[官网地址](https://www.httrack.com/) 2. 新建项目 ➔ 输入目标网站URL ➔ 选择保存路径 3. 勾选选项: - **“捕获所有文件”** - **“解析JavaScript/CSS中的链接”** - **“保留原始目录结构”** 4. 点击开始 ➔ 等待抓取完成 --- #### **二、网站内容转JSON** 需将下载的HTML/资源转化为结构化数据,推荐使用Python脚本处理: --- ##### **步骤1:提取关键数据** ```python from bs4 import BeautifulSoup import json import os # 遍历下载的HTML文件 output_data = [] for root, dirs, files in os.walk("example.com"): for file in files: if file.endswith(".html"): path = os.path.join(root, file) with open(path, "r", encoding="utf-8") as f: soup = BeautifulSoup(f.read(), "html.parser") # 提取标题、正文、图片等 entry = { "url": path.replace("example.com/", "https://example.com/"), "title": soup.title.text.strip() if soup.title else "", "content": soup.get_text(separator=" ", strip=True), "images": [img["src"] for img in soup.find_all("img") if "src" in img.attrs], "links": [a["href"] for a in soup.find_all("a") if "href" in a.attrs] } output_data.append(entry) # 保存为JSON with open("website_data.json", "w", encoding="utf-8") as f: json.dump(output_data, f, ensure_ascii=False, indent=2) ``` --- ##### **步骤2:进阶处理(可选)** 1. **数据清洗** - 移除广告代码(通过HTML标签特征过滤) - 提取结构化字段(如价格、日期等正则匹配) ```python import re # 示例:提取所有价格 prices = re.findall(r"\$\d+\.\d{2}", entry["content"]) ``` 2. **关联资源文件** - 将图片路径映射到本地文件 ```python entry["local_images"] = [ os.path.relpath(os.path.join(root, img_src), start="example.com") for img_src in entry["images"] ] ``` 3. **分块存储** - 按目录或页面类型拆分JSON文件 ```python if "blog" in entry["url"]: with open("blog_pages.json", "a") as f_blog: f_blog.write(json.dumps(entry) + "\n") ``` --- #### **三、自动化工具推荐** 1. **Scrapy + Item Pipeline** - 使用Scrapy框架抓取网站并直接输出JSON - 示例配置: ```python class WebsitePipeline: def process_item(self, item, spider): with open("output.json", "a") as f: line = json.dumps(dict(item)) + "\n" f.write(line) return item ``` 2. **可视化转换工具** - 使用 [Import.io](https://www.import.io/) 或 [Octoparse](https://www.octoparse.com/) - 通过界面选择元素 ➔ 自动生成结构化数据表 ➔ 导出为JSON --- #### **四、注意事项** 1. **法律与伦理** - 遵守目标网站的 `robots.txt` 协议 - 避免抓取敏感信息(用户隐私、付费内容等) 2. **技术限制** - 动态加载内容(如React/Vue页面)需配合 `Selenium` 或 `Puppeteer` - 反爬机制处理(随机User-Agent、请求间隔设置) 3. **数据验证** - 检查JSON格合法性(可用 [JSONLint](https://jsonlint.com/)) - 对比原始网站与JSON数据的完整性 --- #### **五、最终输出示例** ```json [ { "url": "https://example.com/about", "title": "关于我们", "content": "公司成立于2010年...", "images": ["/static/logo.png", "/photos/team.jpg"], "links": ["/contact", "/products"] }, { "url": "https://example.com/products", "title": "产品列表", "content": "旗舰产品A 价格$199.99...", "images": ["/products/a.jpg"], "links": ["/cart"] } ] ``` --- 通过以上步骤,可系统性地将整站资源转化为结构化JSON数据。建议先在小规模测试页面试运行,再逐步扩展至全站。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源码小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值