【问题标题】:Find and replace value inside an array of objects javascript [duplicate]在对象数组中查找和替换值javascript [重复]
【发布时间】:2017-12-26 14:58:20
【问题描述】:

我有一个对象数组:

[
 {
    "enabled": true,
    "deviceID": "eI2K-6iUvVw:APA"
},
{
    "enabled": true,
    "deviceID": "e_Fhn7sWzXE:APA"
},
{
    "enabled": true,
    "deviceID": "e65K-6RRvVw:APA"
}]

带有eI2K-6iUvVw:APA 的设备ID 的POST 请求传入,我要做的就是迭代数组,找到设备ID 并将enabled 的值更改为false

这在 javascript 中怎么可能?

【问题讨论】:

  • 这不是正确的 JS 数据结构。
  • 这里的答案是完美的。上面的“已经有答案”是针对一个 9 岁的问题,答案不如这个。

标签: javascript arrays lodash


【解决方案1】:

您可以使用Array#find

let arr = [
  {
    "enabled": true,
    "deviceID": "eI2K-6iUvVw:APA",
  },
  {
    "enabled": true,
    "deviceID": "e_Fhn7sWzXE:APA",
  },
  {
    "enabled": true,
    "deviceID": "e65K-6RRvVw:APA",
  },
];

const id = 'eI2K-6iUvVw:APA';

arr.find(v => v.deviceID === id).enabled = false;

console.log(arr);

【讨论】:

  • 任何想法,我们如何一次更新多个键值,就像我需要在启用时更新设备ID
  • @LalitMohan 将找到的对象存储在一个变量中,然后更改多个属性:const obj = arr.find(v => v.deviceID === id); obj.enabled = false; obj.deviceID = 'your ID';
【解决方案2】:

您可以使用Array.reduce 在禁用新设备的情况下复制阵列:

const devices = [ /* ... */ ];

const newDevices = devices.reduce((ds, d) => {
  let newD = d;
  if (d.deviceID === 'eI2K-6iUvVw:APA') {
    newD = Object.assign({}, d, { enabled: false });
  }
  return ds.concat(newD);
}, []);

【讨论】:

  • reduce 对于这种类型的操作来说并不是很理想,因为您正在重新创建整个数组并更改了一个属性。
  • @James 你能提出更好的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 2021-11-14
  • 2018-12-18
  • 2014-08-08
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多