es6 循环往数组对象中的 每一项对象中 添加 自定义字段 map ;Map 和ForEach 的区别

Map 和ForEach 的区别

Map:

 <script>
        const {
            log
        } = console;

    

        const oldArray=[{zhang:1},{yu:2}]

         oldArray.map((item)=>{
             let key='yes'
             let value='你不要这么刚!'
             item[key]=value
         })


        log('oldArray', oldArray)
        
map 不return        修改原数组

    </script>

在这里插入图片描述
1 map 不return 修改原数组

 <script>
        const {
            log
        } = console;

    

        const oldArray=[{zhang:1},{yu:2}]

        const newArray=oldArray.map((item)=>{
                let key='yes'
                let value='你不要这么刚!'
              return  item[key]=value
            })


        log('oldArray', oldArray)
        log('newArray', newArray)

    </script>

在这里插入图片描述
2 map ,return了; 修改原数组 并且返回一个新数组;

//总结: map 可以return 也可以不return , 都会修改原数组;
map return 的时候,会返回 一个新数组;
3 map性能比forEach好70% ;
在这里插入图片描述
ForEach :

情况1
在这里插入图片描述

<script>
        const {
            log
        } = console;

    

        const oldArray=[{zhang:1},{yu:2}]

        const newArray=oldArray.forEach((item)=>{
                let key='yes'
                let value='你不要这么刚!'
              return  item[key]=value
            })


        log('oldArray', oldArray)
        log('newArray', newArray)

    </script>

情况2:
在这里插入图片描述
再总结:

1都return了!!!
2forEach是不会返回有意义的值的。

let arr = [1, 2, 3, 4, 5];

// ForEach

// 注意,forEach是不会返回有意义的值的。
// 我们在回调函数中直接修改arr的值。

arr.forEach((num, index) => {//在原数组中 直接操作num, index, return了!!!
 return arr[index] = num * 2;
});
// 执行结果如下:
// arr = [2, 4, 6, 8, 10]

// Map

let doubled = arr.map(num => { //直接声明了新数组 直接操作 原数组中的item  return了!!!
 return num * 2;
});
// 执行结果如下:

// doubled = [2, 4, 6, 8, 10]


log('newArray', arr)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
map 不会修改原数组,返回一个新数组;正解!!!

let arr = [1, 2, 3, 4, 5];

let doubled = arr.map(num => { //直接声明了新数组 直接操作 原数组中的item
 return num * 2;
});

log('doubled', doubled)
log('arr', arr)

在这里插入图片描述

// forEach 修改原数组  正解!!!

let arr = [1, 2, 3, 4, 5];

arr.forEach((num, index) => {//在原数组中 直接操作num, index, 记得要return!!!
 return arr[index] = num * 2;
});
// 执行结果如下:
// arr = [2, 4, 6, 8, 10]

// log('doubled', doubled)
log('arr', arr)

在这里插入图片描述
经过实测证明, foeEach 和Map 都return forEach直接操作num,index map声明了一个新数组,直接操作的num;forEach确实会修改原数组的值,map 不会修改原数组的值,操作num后 的值 都返回到了新声明的那个数组;

最后,什么时候使用forEach 什么时候使用map:

forEach适合于你并不打算改变数据的时候,而只是想用数据做一些事情 – 比如存入数据库或则打印出来。

let arr = ['a', 'b', 'c', 'd'];
arr.forEach((letter) => {
 console.log(letter);
});
// a
// b
// c
// d

map()适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。

let arr = [1, 2, 3, 4, 5];
let arr2 = arr.map(num => num * 2).filter(num => num > 5);
// arr2 = [6, 8, 10]

我们首先使用map将每一个元素乘以2,然后紧接着筛选出那些大于5的元素。最终结果赋值给arr2。

核心要点

能用forEach()做到的,map()同样可以。反过来也是如此。

map()会分配内存空间存储新数组并返回,forEach()不会返回数据。

forEach() 允许callback 更改 原始数组 的元素。

map() 返回 新的数组。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用reduce方法来实现这个功能。假设有一个包含多个对象数组,每个对象都有一个相同的属性字段,可以按照以下步骤来实现统计相同属性字段的值的和: 1. 使用reduce方法遍历数组,将每个对象属性值作为key,属性值作为value存储在一个对象。 2. 在reduce方法的回调函数,如果当前key已经存在于对象,则将其对应的value值加上当前对象属性值,否则将当前key和属性值作为的键值对添加对象。 3. 最后返回对象,其每个属性字段的值都是原数组对应字段值的总和。 下面是一个示例代码: ```javascript const arr = [ { name: 'apple', num: 2 }, { name: 'banana', num: 3 }, { name: 'apple', num: 4 }, { name: 'orange', num: 1 }, { name: 'banana', num: 5 } ]; const result = arr.reduce((acc, cur) => { const key = cur.name; if (acc[key]) { acc[key] += cur.num; } else { acc[key] = cur.num; } return acc; }, {}); console.log(result); // { apple: 6, banana: 8, orange: 1 } ``` 在上面的代码,我们使用reduce方法遍历数组`arr`,并将每个对象的`name`属性作为key,属性值`num`作为value存储在对象`acc`。如果当前key已经存在于对象,则将其对应的value值加上当前对象属性值,否则将当前key和属性值作为的键值对添加对象。最后返回对象`acc`,其每个属性字段的值都是原数组对应字段值的总和。 运行上面的代码,将输出一个对象,其每个属性字段的值都是原数组对应字段值的总和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值