前端开发中数组

admin2周前 (05-18)it知识88

前端开发中,数组是最基础且强大的数据结构之一。JavaScript提供了丰富的数组操作方法,可以满足各种开发需求。

下面我将从基础操作、高阶函数、动态渲染、过滤搜索和表单处理五个方面,为您详细介绍前端数组的实际应用案例。

一、基础数组操作案例

1. 数组创建与转换

// 字符串转数组
const str = "get-element-by-id";
const arr = str.split("-"); // ["get", "element", "by", "id"]
// 类数组对象转数组
const nodeList = document.querySelectorAll('div');
const nodeArr = Array.from(nodeList); // 将NodeList转换为真正数组

2. 数组清空方法

let arrayList = ['a', 'b', 'c', 'd', 'e', 'f'];
// 方法1:直接赋值为空数组
arrayList = [];
// 方法2:设置length为0
arrayList.length = 0; // 推荐此方法,更简洁高效

3. 数组增删改查

const fruits = ['apple', 'banana'];
// 添加元素
fruits.push('orange'); // 末尾添加
fruits.unshift('grape'); // 开头添加
// 删除元素
fruits.pop(); // 删除最后一个
fruits.shift(); // 删除第一个
// splice方法(会修改原数组)
const removed = fruits.splice(1, 1, 'pear', 'peach'); 
// 从索引1开始删除1个元素,并添加'pear'和'peach'
// removed是被删除的元素数组['banana']

4. 统计学生成绩案例

const scores = [89, 76, 92, 85, 94, 88];
// 计算总分和平均分
const totalScore = scores.reduce((acc, score) => acc + score, 0);
const averageScore = totalScore / scores.length;
// 最高分和最低分
const highestScore = Math.max(...scores);
const lowestScore = Math.min(...scores);
console.log(`平均分: ${averageScore}, 最高分: ${highestScore}, 最低分: ${lowestScore}`);

二、数组高阶函数应用案例

1. filter() 过滤方法

// 过滤小于100的数字
const nums = [10, 20, 30, 111, 222, 333];
const newNums = nums.filter(n => n < 100); // [10, 20, 30]
// 过滤素数
function get_primes(arr) {
  return arr.filter(num => {
    if(num === 1) return false;
    for(let i=2; i<=Math.sqrt(num); i++) {
      if(num % i === 0) return false;
    }
    return true;
  });
}

2. map() 映射方法


// 将数字数组每个元素乘以2
const doubled = newNums.map(n => n * 2); // [20, 40, 60]
// 格式化对象数组
const users = [
  {name: 'John', age: 25},
  {name: 'Jane', age: 30}
];
const names = users.map(user => user.name); // ['John', 'Jane']

3. reduce() 归约方法


// 数组求和
const sum = nums.reduce((acc, n) => acc + n, 0);
// 数组去重
const dupArr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = dupArr.reduce((acc, cur) => {
  if(!acc.includes(cur)) acc.push(cur);
  return acc;
}, []);
// 统计字符出现次数
const str = "javascript";
const charCount = [...str].reduce((acc, char) => {
  acc[char] = (acc[char] || 0) + 1;
  return acc;
}, {});

4. 复合使用案例

// 链式调用:先过滤再映射最后求和
const total = nums
  .filter(n => n < 100)
  .map(n => n * 2)
  .reduce((acc, n) => acc + n, 0);


三、数组动态渲染案例

1. Vue动态渲染表格

// Vue组件数据
data() {
  return {
    tableData: [
      { date: '2016-05-03', name: 'Tom', address: 'No. 189, Grove St' },
      { date: '2016-05-02', name: 'Jerry', address: 'No. 189, Grove St' }
    ],
    columns: [
      { prop: 'date', label: '日期' },
      { prop: 'name', label: '姓名' },
      { prop: 'address', label: '地址' }
    ]
  };
}
// 模板部分
<el-table :data="tableData">
  <el-table-column 
    v-for="column in columns" 
    :key="column.prop"
    :prop="column.prop"
    :label="column.label">
  </el-table-column>
</el-table>


2. 动态添加表单字段

// Vue组件数据
data() {
  return {
    form: {
      name: '水果',
      goods: [
        { name: '西瓜', num: 20 },
        { name: '苹果', num: 23 }
      ]
    }
  };
}
// 添加新商品方法
methods: {
  addGood() {
    this.form.goods.push({ name: '', num: 0 });
  }
}


四、数组过滤搜索案例

1. 单条件筛选

const products = [
  { name: 'iPhone', category: 'electronics', price: 999 },
  { name: 'MacBook', category: 'electronics', price: 1299 },
  { name: 'T-shirt', category: 'clothing', price: 20 }
];
// 筛选电子产品
const electronics = products.filter(p => p.category === 'electronics');
// 筛选价格低于1000的商品
const affordable = products.filter(p => p.price < 1000);

2. 多条件复合筛选

// 筛选条件
const filters = {
  category: 'electronics',
  maxPrice: 1000
};
// 复合筛选
const filtered = products.filter(p => {
  return (
    p.category === filters.category && 
    p.price <= filters.maxPrice
  );
});

3. Vue实现搜索功能

// Vue组件
new Vue({
  el: '#app',
  data: {
    search: '',
    items: ['Apple', 'Banana', 'Orange', 'Mango', 'Pear']
  },
  computed: {
    filteredItems() {
      const search = this.search.toLowerCase();
      return this.items.filter(item => 
        item.toLowerCase().includes(search)
      );
    }
  }
});
// HTML部分
<div id="app">
  <input v-model="search" type="text" placeholder="Search...">
  <ul>
    <li v-for="item in filteredItems">{{ item }}</li>
  </ul>
</div>

4. 复杂对象数组筛选

const employees = [
  { name: 'John', age: 28, department: 'IT', skills: ['JavaScript', 'React'] },
  { name: 'Jane', age: 32, department: 'HR', skills: ['Communication'] },
  { name: 'Bob', age: 25, department: 'IT', skills: ['JavaScript', 'Node.js'] }
];
// 多条件筛选:IT部门且会JavaScript的员工
const itJsDevs = employees.filter(emp => 
  emp.department === 'IT' && 
  emp.skills.includes('JavaScript')
);
// 年龄范围筛选
const youngEmployees = employees.filter(emp => emp.age >= 25 && emp.age <= 30);

五、数组表单处理案例

1. 表单数组提交

<!-- 前端表单传递数组数据 -->
<form action="/submit" method="post">
  <input type="text" name="items[]" value="item1">
  <input type="text" name="items[]" value="item2">
  <input type="text" name="items[]" value="item3">
  <button type="submit">提交</button>
</form>
<!-- 后端接收到的数据格式为数组 -->

2. Vue动态表单验证

// Vue组件数据
data() {
  return {
    form: {
      name: '水果',
      goods: [
        { name: '西瓜', num: 20 },
        { name: '苹果', num: 23 }
      ]
    },
    rules: {
      'goods.*.name': [{ required: true, message: '请输入水果名', trigger: 'blur' }],
      'goods.*.num': [{ required: true, message: '请输入数量', trigger: 'blur' }]
    }
  };
}
// 模板部分
<div v-for="(item, index) in form.goods" :key="index">
  <el-form-item 
    :prop="'goods.' + index + '.name'" 
    :rules="rules['goods.*.name']">
    <el-input v-model="item.name" placeholder="水果名"/>
  </el-form-item>
  
  <el-form-item 
    :prop="'goods.' + index + '.num'" 
    :rules="rules['goods.*.num']">
    <el-input v-model="item.num" placeholder="数量"/>
  </el-form-item>
</div>

3. 表单数据处理

// 处理多选框数据
const formData = {
  name: '用户表单',
  hobbies: ['reading', 'swimming', 'coding'] // 多选框选中值
};
// 提交前处理
function prepareSubmit(data) {
  // 将数组转换为逗号分隔的字符串
  if(Array.isArray(data.hobbies)) {
    data.hobbies = data.hobbies.join(',');
  }
  return data;
}
// 接收后处理
function processReceived(data) {
  // 将字符串转换回数组
  if(typeof data.hobbies === 'string') {
    data.hobbies = data.hobbies.split(',');
  }
  return data;
}

4. 动态表单字段管理

// 添加新字段
function addField(form, fieldName) {
  if(!form[fieldName]) {
    form[fieldName] = [];
  }
  form[fieldName].push('');
}
// 删除字段
function removeField(form, fieldName, index) {
  if(form[fieldName] && form[fieldName].length > index) {
    form[fieldName].splice(index, 1);
  }
}
// 示例使用
const myForm = { items: [] };
addField(myForm, 'items'); // 添加一个空项
removeField(myForm, 'items', 0); // 删除第一项


标签: 分享IT知识

相关文章

技术与艺术的融合:创造无比魅力的结合

在人类文明的发展史上,技术与艺术如同一对形影不离的伙伴,共同推动了人类社会的进步。随着科技的飞速发展,技术与艺术的融合愈发紧密,为我们揭示了一个全新的视角,让我们重新审视这两股强大的力量。在当今数字化...

优美程序是怎样的

程序优美是一个主观的概念,每个人可能会有不同的看法。然而,以下是一些可能导致程序优美的因素:简洁性:优美的程序应该尽可能地简洁明了。这意味着应该使用尽可能少的数据结构和算法,以及尽可能简单的代码。可读...

个人学习计划

学习计划是一个帮助你提高学习效率和使用时间的有效工具。以下是一个可能的学习计划:目标设定。 在开始学习之前,明确你的学习目标和目的地,这有助于你制定实际可行的计划。分解任务。 将大...

炎热的夏天

夏天是一个充满活力和热情的季节,炎热的的气息让人感到无力和疲惫。但是,这个季节也有着许多美好的回忆和乐趣,让我们一起来看看夏天的美好与炎热吧。首先,夏天的天气非常炎热,太阳高照,蓝天白云,气温高达30...

敏捷开发

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可...

如何学习 javascript

学习JavaScript需要以下步骤:基础语法:学习JavaScript的基础语法,包括变量、数据类型、函数、循环、条件语句等。DOM 操作:学习如何操作 DOM,例如获取和修改元素、添加和删除事件处...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。