简单知识点实例之一:如何将各个单一获取的数据存储为数组对象并将其取出

本文介绍了JavaScript中三种存储数据的方法:使用数组存储单个值,使用对象存储多个属性值,以及使用数组对象存储多个带有属性的数据集合。每种方法都通过实例展示了如何获取HTML输入元素的值,并将其存储起来。

一、将获取的值存为数组或数组对象

(1)存为数组(例如所有怪物的id值可以存为数组)

是以逗号隔开的,建议用到存单个特定值时用(如光存id值时)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        window.onload = function () {
            //获取各个输入框的值
            var ids = $("#inputId").val();

            //定义一个空数组
            var arryList = new Array();

            //将获取的值存为数组
            arryList.push(ids);
            alert(arryList);
        }
    </script>
</head>
<body>
    <input type="text" value="123456" id="inputId"/>
</body>
</html>


取值:直接可以用for循环对比里面的值即可

(2)存为对象(例如一个怪物的所有属性值可以存为对象:id,type,name)

如果有多条数据,会以序号分别列出来。建议以此去多个值混合的多条数据。这样取值方便很多。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        window.onload = function () {
            //获取各个输入框的值
            var ids = $("#inputId").val();
            var names = $("#inputName").val();
            var types = $("#inputType").val();

            //定义一个对象
            var obj = new Object();

            //将获取的值存入对象
            obj.id = ids;
            obj.name = names;
            obj.type = types;
            console.log(obj);
        }
    </script>
</head>
<body>
    <input type="text" value="123456" id="inputId"/>
    <input type="text" value="我是输入框的名字" id="inputName"/>
    <input type="text" value="0" id="inputType"/>
</body>
</html>

取值:XXX.id   XXX.name   XXX.type即可(i是序号)

(3)存为数组对象(例如多个怪物的多个属性值可以存为数组对象:id,name,type)

何为数组对象?就是数组包裹着对象的数据形式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.11.1.js"></script>
    <script>
        window.onload = function () {
            //获取各个输入框的值
            var ids = $("#inputId").val();
            var names = $("#inputName").val();
            var types = $("#inputType").val();

            //定义一个空数组
            var arryList = new Array();
            //定义一个对象
            var obj = new Object();

            //将获取的值存入对象
            obj.id = ids;
            obj.name = names;
            obj.type = types;
            arryList.push(obj);
            console.log(arryList);
        }
    </script>
</head>
<body>
    <input type="text" value="123456" id="inputId"/>
    <input type="text" value="我是输入框的名字" id="inputName"/>
    <input type="text" value="0" id="inputType"/>
</body>
</html>

取值:XXX[i].id   XXX[i].name   XXX[i].type即可(i是序号)

<think>我们有一个对象数组,比如arr1。我们想使用map遍历它,同时需要从另一个对象数组arr2中添加属性。假设两个数组中的对象有某种关联关系(比如通过id关联),我们需要在遍历arr1时找到arr2中对应的对象,然后将arr2中的某些属性添加到arr1当前对象的副本中。注意:我们不应该改变原始数组,因此使用map返回一个新数组。步骤:1.使用arr1.map()遍历每个元素。2.在map的回调函数中,对于arr1的当前元素,我们需要在arr2中找到对应的元素(通常通过某个唯一标识符,比如id)。3.将arr2中找到的元素的某些属性添加到当前元素的副本中(可以使用扩展运算符...或Object.assign创建副本)。4.返回这个新的合后的对象。示例:假设arr1是用户数组,arr2是用户详细信息数组,它们通过userId关联。代码结构:letnewArray=arr1.map(item=>{//在arr2中查找与当前item具有相同id(或其它键)的对象letfound=arr2.find(element=>element.userId===item.id);//如果找到,则合属性;如果没有找到,也可以选择合一个空对象或者保留原样if(found){//创建一个新对象,包含item的所有属性,添加arr2中找到的对象的某些属性(例如,这里添加found的details属性)return{...item,details:found.details};}else{//如果没有找到,也可以只返回原对象的拷贝,或者添加一个默认值return{...item,details:null};//或者return{...item};}});注意:这里使用find方法在arr2中查找,如果数组很大,效率可能不高。如果性能是关键,可以考虑先将arr2转换为一个以id为键的对象(字典),这样查找就是O(1)的。优化版本:先创建一个arr2的映射:letarr2Map={};arr2.forEach(item=>{arr2Map[item.userId]=item;//假设arr2中的每个对象有一个userId属性,作为键});然后maparr1:letnewArray=arr1.map(item=>{letfound=arr2Map[item.id];//直接通过键获取if(found){return{...item,details:found.details};}else{return{...item,details:null};}});或者更简洁地使用解构和默认值:letnewArray=arr1.map(item=>({...item,details:(arr2Map[item.id]||{}).details//如果找到就取details,没找到就取空对象的details(即undefined),也可以设置默认值}));或者如果希望没有找到时details为null:letnewArray=arr1.map(item=>{letfound=arr2Map[item.id];return{...item,details:found?found.details:null};});根据实际需求调整。示例代码:假设有两个数组:constusers=[{id:1,name:'Alice'},{id:2,name:'Bob'}];constuserDetails=[{userId:1,age:25,city:'Paris'},{userId:2,age:30,city:'London'}];我们想将userDetails中的age和city添加到users对应的用户中。先创建userDetails的映射:constdetailsMap={};userDetails.forEach(detail=>{detailsMap[detail.userId]={age:detail.age,city:detail.city};});然后mapusers:constusersWithDetails=users.map(user=>{constdetail=detailsMap[user.id];return{...user,...detail//直接将detail对象的属性展开到新对象中};});这样usersWithDetails就变成:[{id:1,name:'Alice',age:25,city:'Paris'},{id:2,name:'Bob',age:30,city:'London'}]注意:如果userDetails中可能没有某个userId,那么detail就是undefined,展开...undefined不会有任何效果,所以我们可以使用条件合:另一种写法:constusersWithDetails=users.map(user=>({...user,...(detailsMap[user.id]||{})//如果存在就展开,不存在就展开空对象}));这样,如果没找到,就只保留user的属性。如果希望为没找到的项设置默认值,可以:constusersWithDetails=users.map(user=>{constdetail=detailsMap[user.id];return{...user,age:detail?detail.age:null,city:detail?detail.city:null};});根据具体需求选择。因此,在JavaScript中使用map遍历对象数组添加另一个对象数组的属性,关键在于建立第二个数组的映射(通常用对象或Map数据结构),然后在map回调函数中进行合。注意:如果使用ES6的Map对象也可以,但这里用普通对象作为映射已经足够。代码示例:</think>### 在 JavaScript 中使用 Map 遍历对象数组添加另一个数组的属性 在 JavaScript 中,您可以使用 `map()` 方法遍历对象数组结合 `find()` 方法从另一个数组匹配对应元素,然后使用对象展开运算符 `...` 或 `Object.assign()` 合属性。以下是具体实现方法: #### 核心代码实现 ```javascript // 原始数组 const users = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" } ]; // 要合属性的数组 const userDetails = [ { userId: 1, age: 28, city: "Paris" }, { userId: 2, age: 32, city: "London" } ]; // 使用 map 遍历属性 const mergedUsers = users.map(user => { // 在 userDetails 中查找匹配项 const details = userDetails.find(d => d.userId === user.id); // 返回新对象(不修改原数组) return { ...user, // 展开原对象属性 ...details, // 展开匹配到的属性 id: user.id // 防止 userId 覆盖 id(可选) }; }); console.log(mergedUsers); /* 输出: [ { id: 1, name: "Alice", userId: 1, age: 28, city: "Paris" }, { id: 2, name: "Bob", userId: 2, age: 32, city: "London" } ] */ ``` #### 关键步骤说明: 1. **`map()` 遍历主数组** 对主数组的每个元素执行操作返回新数组[^3]。 2. **`find()` 匹配关联对象** 在第二个数组中查找关联项(通过 `userId === id` 等关联键)[^4]。 3. **对象展开运算符 `...`** 合两个对象的属性,后展开的属性会覆盖前者[^1]。 4. **保持不可变性** 始终返回新对象,避免修改原数组元素。 #### 性能优化方案(处理大数据) 当数组较大时,可先创建查找字典提升性能: ```javascript // 将 userDetails 转为字典 { userId: details } const detailsMap = Object.fromEntries( userDetails.map(d => [d.userId, d]) ); const optimizedMerge = users.map(user => ({ ...user, ...(detailsMap[user.id] || {}) // 防止未匹配时出错 })); ``` #### 处理属性冲突 若两个数组有同名属性,可通过重命名解决: ```javascript const mergedUsers = users.map(user => { const { userId, ...restDetails } = userDetails.find(d => d.userId === user.id) || {}; return { ...user, ...restDetails, detailsUserId: userId // 重命名冲突属性 }; }); ``` ### 注意事项 1. **确保有关联键** 两个数组需有可关联的字段(如 `id` 和 `userId`)。 2. **处理未匹配项** 使用 `|| {}` 为未匹配项提供空对象,避免 `undefined` 错误。 3. **深层复制** 若对象含嵌套结构,需使用 `JSON.parse(JSON.stringify())` 或 Lodash 的 `_.cloneDeep()`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值