在javascript中使用reduce更改对象值

如何解决在javascript中使用reduce更改对象值

我想使用reduce改变对象的值,但结果与我预期的不同。

const test = [
  {id: 'start',value: false},{id: 'reject',];

let ress;
const showModal = (which) => {
  const res = test.reduce((res,s) => {
    ress = {id: s.id,value: s.id === which ? (s.value = true) : (s.value = false)};
    return ress;
  },[]);
}

showModal('start');
console.log(ress);

实际结果:

{
  "id": "reject","value":false
}

预期:

[
  {id: 'start',value: true},]

我不明白,为什么删除{id:'start',value:true} 并且 key 更改为 string 类型。

这是一个工作示例: https://codepen.io/seoulsaram/pen/RwpJRPv?editors=1010
谢谢!

解决方法

const res = test.reduce((res,s) => {
  ress = {
    id: s.id,value: s.id === which ? (s.value = true) : (s.value = false)
  };
  return ress; // returning always last object as result.
},[]);

此代码不正确,您总是推送最新的对象。

这里应该是什么样子(这不是实现这一目标的最佳方式,我只是让您的代码按您的预期工作):

const res = test.reduce((res,s) => {
  const ress = {
    id: s.id,value: s.id === which ? (s.value = true) : (s.value = false)
  }
  res.push(ress)
  return res; // return accumulator instead of object
},[]);

根据您的问题,看起来您正在寻找 find 而不是减少。

这是对您的情况更好的方法(改变原始数组):

const test = [
  {id: 'start',value: false},{id: 'reject',]

const showModal = (which) => {
  const found = test.find(e => e.id === which)
  found.value = true // it will mutate object in array
}

showModal('start')
console.log(test)

另一种解决方案(不改变原始数组):

const test = [
  {id: 'start',]

const showModal = (which) => test.map(e => e.id === which ? ({...e,value: true}) : {...e})

const res = showModal('start')

console.log('res',res)
console.log('test',test)

,

有几点需要注意。在 reduce 中,您应该在每次迭代中返回累加数组,而是返回您在循环内创建的变量(res 而不是 ress) - 它们的名称非常相似,因此是一个简单的错字。

您的三元条件不正确(导致响应不正确),可以简化。 value: s.id === which ? (s.value = true) : (s.value = false) 评估不正确 - 更容易做到 value: s.id === which

每次迭代我都使用 [...] 扩展运算符将累积数组与新对象连接起来。

const test = [{
    id: 'start',value: false
  },{
    id: 'reject',];

let ress;
const showModal = (which) => {
  return test.reduce((res,s) => {
    ress = {
      id: s.id,value: s.id === which
    };
    return [...res,ress]
  },[]);
}

console.log(showModal('start'));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?