2024-08-26

JavaScript中数组去重的方法有很多种,以下是14种常见的方法:

  1. 使用 Set



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
  1. 使用 filter 和 indexOf



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
  1. 使用 reduce



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((accumulator, current) => {
  if (accumulator.indexOf(current) === -1) {
    accumulator.push(current);
  }
  return accumulator;
}, []);
  1. 使用 Map 或 Object



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = Array.from(array.reduce((map, item) => map.set(item, item), new Map()).values());
  1. 使用 sort 和 lastItem 变量



const array = [1, 2, 2, 3, 4, 4, 5];
array.sort();
const uniqueArray = array.filter((item, index, arr) => item !== arr[index + 1]);
  1. 使用 for 循环和 indexOf



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [];
for (let i = 0; i < array.length; i++) {
  if (uniqueArray.indexOf(array[i]) === -1) {
    uniqueArray.push(array[i]);
  }
}
  1. 使用 includes



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((item, index, arr) => !arr.includes(item, index + 1));
  1. 使用 reduce 和 includes



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((accumulator, current) => {
  if (!accumulator.includes(current)) {
    accumulator.push(current);
  }
  return accumulator;
}, []);
  1. 使用 reduce 和 Map



const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((map, item) => map.set(item, item), new Map()).values();
  1. 使用 filter 和 indexOf 进行深度比较



const array = [{ id: 1 }, { id: 2 }, { id: 1 }, { id: 3 }];
const uniqueArray = array.filter((item, index) => 
  index === array.findIndex(subItem => subItem.id === item.id)
);
  1. 使用 reduce 和 Object



const array = [{ id: 1 }, { id: 2 }, { id: 1 }, { id: 3 }];
const uniqueArray = array.reduce((accumulator, current) => {
  if (!accumulator.find(item => item.id === current.id)) {
    accumulator.push(current);
  }
  return accumulator;
}, []);
  1. 使用 Map 和 forEach



const array = [{ id: 1 }, { id: 2 }, 
2024-08-26

以下是一个简单的JavaScript脚本,用于从网页中提取所有的文本内容。这个脚本会获取页面上所有的文本节点,并将它们拼接成一个字符串。




function extractTextContent(node) {
  var textContent = '';
 
  function getText(node) {
    if (node.nodeType === Node.TEXT_NODE) {
      textContent += node.textContent.trim();
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      var childNodes = node.childNodes;
      for (var i = 0; i < childNodes.length; i++) {
        getText(childNodes[i]);
      }
    }
  }
 
  getText(node);
  return textContent;
}
 
// 使用方法:
// 假设你已经有了一个DOM对象,比如document
var pageText = extractTextContent(document);
console.log(pageText);

这段代码定义了一个extractTextContent函数,它接受一个DOM节点作为参数,并递归地遍历这个节点下的所有子节点,将文本节点的内容拼接起来返回。在实际使用时,你需要确保这段脚本在页面加载完成后执行,例如你可以将它放在一个window.onload事件处理函数中,或者使用现代的方法如document.addEventListener('DOMContentLoaded', function() { /* 脚本内容 */ });

2024-08-26

在Java中,可以使用org.json库或者com.google.gson库来快速读取和解析JSON数据。以下是使用org.json库的一个例子:

首先,添加org.json库到你的项目中。如果你使用Maven,可以添加以下依赖:




<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20210307</version>
</dependency>

然后,使用以下代码来读取和解析JSON文件:




import org.json.JSONObject;
import java.nio.file.Files;
import java.nio.file.Paths;
 
public class JsonParserExample {
    public static void main(String[] args) {
        String pathToJsonFile = "path/to/your/jsonfile.json";
 
        try {
            // 读取文件内容到字符串
            String jsonContent = new String(Files.readAllBytes(Paths.get(pathToJsonFile)));
 
            // 解析JSON字符串
            JSONObject jsonObject = new JSONObject(jsonContent);
 
            // 获取想要的内容
            String someData = jsonObject.getString("someKey");
            int someInt = jsonObject.getInt("someIntKey");
 
            // 输出获取的内容
            System.out.println("Data: " + someData);
            System.out.println("Int: " + someInt);
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

确保替换path/to/your/jsonfile.json为你的JSON文件的实际路径,以及将"someKey""someIntKey"替换为你想要获取的实际键。

这个例子展示了如何使用org.json库快速读取和解析JSON文件。如果你想使用com.google.gson库,代码会有所不同,但基本步骤是一样的:读取文件内容,解析为JSON对象,然后获取所需的数据。

2024-08-26

这个错误是由JavaScript运行时环境(如Node.js)中的V8引擎产生的,表示JavaScript虚拟机在进行垃圾回收时遇到了问题。具体来说,“FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed”意味着垃圾回收器在尝试回收和整理堆空间时效率不高,而且在接近堆的限制时分配失败了。

解释:

  1. "Ineffective mark-compacts":垃圾回收器在进行标记清除(mark-sweep)后,为了减少空间碎片,进行了一次整理(mark-compact),但效率不高。
  2. "heap limit":指的是JavaScript的堆内存已经接近或达到了其分配的最大限制。
  3. "Allocation failed":意味着在尝试为新对象分配内存时失败了,可能是因为没有更多的可用内存。

解决方法:

  1. 增加内存限制:可以通过启动Node.js时设置内存大小来尝试增加限制,例如使用node --max-old-space-size=1024来设置1024MB的内存限制。
  2. 检查内存泄漏:检查代码中是否有导致大量内存无法被垃圾回收器回收的问题,比如无法被释放的全局变量或者闭包等。
  3. 优化代码:减少内存消耗,比如通过使用更有效的数据结构,避免不必要的大型对象分配等。
  4. 分批处理数据:如果是处理大量数据导致的内存溢出,尝试分批次处理数据,而不是一次性加载所有数据。
  5. 使用外部资源:对于真的需要大量内存的应用,可以考虑使用像数据库这样的外部资源来存储不常访问的数据,减少对JavaScript堆内存的需求。
2024-08-26

JavaScript中的alert()函数用于弹出一个警告框,显示一条信息给用户。警告框通常包含一个“OK”按钮让用户关闭它。

语法




alert(message);
  • message:要在警告框中显示的信息,可以是字符串、数字或任何值的字符串表示。

示例




// 显示简单的消息
alert("这是一个警告框!");
 
// 显示变量值
let age = 25;
alert("我的年龄是: " + age);
 
// 显示表达式结果
alert(2 + 2); // 将显示 "4"
 
// 使用模板字符串显示复杂的消息(ES6及以上版本)
alert(`你好,世界!\n这是一个新的一行。`);

警告框是同步的,即在用户关闭警告框之前,代码会停止执行。因此,不要在警告框后面紧跟需要用户交互的代码,否则可能会导致不正确的行为。

2024-08-26

JavaScript 是单线程语言,没有像其他编程语言中的 sleep 函数。但是,你可以使用 Promise 和 async/await 来模拟 sleep 功能。以下是一个示例:




function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
 
// 使用 async/await 调用 sleep
async function demo() {
  console.log('Before sleep');
  await sleep(2000); // 暂停 2 秒
  console.log('After sleep');
}
 
demo();

在这个例子中,sleep 函数接收一个毫秒数作为参数,并返回一个 Promise,在指定的毫秒数后解决。demo 函数是一个异步函数,它在控制台中打印 "Before sleep",然后等待 2 秒钟,之后打印 "After sleep"。

2024-08-26

jspdf是一个用于生成PDF的JavaScript库,它可以在客户端即浏览器中创建PDF文档,这意味着您可以在用户浏览网页的时候即时生成PDF文件。jspdf支持文本、图片以及更复杂的HTML元素的混排。

以下是一个简单的例子,展示如何使用jspdf生成一个包含文本和图片的PDF文档:




// 引入jspdf库
import jsPDF from 'jspdf';
 
// 创建一个新的jsPDF实例
const doc = new jsPDF();
 
// 添加文本到PDF文档
doc.text('Hello world!', 10, 10);
 
// 添加图片到PDF文档
const imageData = 'data:image/png;base64,...'; // 替换为实际的Base64图片数据
doc.addImage(imageData, 'PNG', 15, 15, 100, 100);
 
// 保存生成的PDF
doc.save('test.pdf');

jspdf还提供了更多高级功能,比如通过doc.fromHTML()函数将HTML元素转换为PDF,这可以用来处理更复杂的文档布局。




const source = document.getElementById('my-element-to-export').innerHTML;
 
doc.fromHTML(source, 15, 15, {
  'width': 170,
  'elementHandlers': specialElementHandlers
});
 
doc.save('my-document.pdf');

在这个例子中,specialElementHandlers是一个可选参数,它可以是一个对象,用来定义特定元素如何被处理。

请注意,jspdf不是万能的,它可能不支持所有类型的HTML元素或CSS样式,你可能需要自定义处理某些元素或样式。

2024-08-26



import asyncio
from pyppeteer import launch
 
async def run():
    browser = await launch()
    page = await browser.newPage()
 
    await page.goto('https://example.com')
    # 如果页面使用JavaScript动态渲染,需要等待页面加载完成
    await page.waitForSelector('selector_of_element_to_wait_for', { 'timeout': 30000 })
 
    content = await page.evaluate('''() => {
        // 这里写入你需要从页面中获取数据的JavaScript代码
        // 例如,获取某个元素的文本内容
        const element = document.querySelector('selector_of_element');
        return element.textContent;
    }''')
 
    print(content)
    await browser.close()
 
asyncio.get_event_loop().run_until_complete(run())

这段代码使用了pyppeteer库来启动一个浏览器实例,然后打开了指定的网页。在页面加载完成后,使用evaluate函数执行了一段动态获取页面数据的JavaScript代码。这里的selector_of_elementselector_of_element_to_wait_for需要替换成实际的CSS选择器。

2024-08-26

在JavaScript中,可以使用setTimeout函数来创建一个定时器,该定时器会在指定的毫秒数后执行一个函数。

以下是一个简单的例子,它使用setTimeout来在控制台上输出一条消息:




// 设置定时器,在2000毫秒后执行
setTimeout(function() {
    console.log("2秒已到!");
}, 2000);

如果你想取消已经设置的定时器,可以使用clearTimeout函数。以下是一个取消定时器的例子:




// 创建定时器
var timerId = setTimeout(function() {
    console.log("这个消息不会输出");
}, 2000);
 
// 取消定时器
clearTimeout(timerId);

setTimeoutclearTimeout经常被用来处理异步操作,例如延迟请求、动画等。

2024-08-26



const webdriver = require('selenium-webdriver');
const { By, until } = webdriver;
 
let driver = new webdriver.Builder()
    .forBrowser('firefox')
    .build();
 
driver.get('http://www.example.com');
 
// 等待页面完全加载
driver.wait(until.titleIs('Example Title'), 1000);
 
// 定位到登录按钮并点击
driver.findElement(By.id('loginButton')).click();
 
// 等待登录框出现
driver.wait(until.elementLocated(By.id('loginForm')), 5000);
 
// 输入用户名和密码
driver.findElement(By.id('username')).sendKeys('your-username');
driver.findElement(By.id('password')).sendKeys('your-password');
 
// 提交登录信息
driver.findElement(By.id('loginSubmit')).click();
 
// 等待页面加载完成
driver.wait(until.titleIs('New Title'), 1000);
 
// 爬取页面内容
driver.getPageSource().then(function(pageSource) {
    console.log(pageSource);
});
 
// 关闭浏览器
driver.quit();

这段代码使用了Selenium WebDriver和Node.js来实现一个简单的网页爬取示例。它首先启动了一个Firefox浏览器实例,然后导航到指定的URL。接着,它等待页面标题变为特定值来确认页面加载完成,并定位登录按钮进行点击操作。在登录框出现后,输入用户名和密码,并提交登录信息。最后,等待新页面加载完成,并获取页面源代码,然后关闭浏览器。这个过程展示了如何使用Selenium WebDriver进行基本的自动化测试和页面爬取。