【问题标题】:How to remove an element from an array that is inside an object in React JS (ES6)如何从 React JS (ES6) 中对象内部的数组中删除元素
【发布时间】:2021-04-03 05:47:18
【问题描述】:

我想从对象内部的数组中删除一个元素,并用新值覆盖该对象。请参见下面的示例。

var obj = {
  a: [1, 2, 3],
  b: [4, 5, 6],
  c: [7, 8, 9]
}

我想从obj 中删除数字 5,但不知道该元素在哪个数组中。

我正在尝试使用 Context API 更新响应状态。它应该直接返回对象本身。

case ACTION: return {
  ...state,
  obj: ?
}

预期的最终结果:

var obj = {
  a: [1, 2, 3],
  b: [4, 6],
  c: [7, 8, 9]
}

【问题讨论】:

  • 你标记了这个react,你在用这个状态吗?如果是这样,答案会有所不同,因为您不想直接改变数组。
  • 是的,我在上下文中将它与react 一起使用

标签: javascript arrays reactjs filter


【解决方案1】:

恕我直言,最简单的方法是splice该数组:

obj.b.splice(1, 1);

编辑:
如果您不知道该项目的位置(根据评论),您可以查看所有项目,并过滤每个数组:

const toRemove = 5;
Object.keys(obj).forEach(k => {
    obj[k] = obj[k].filter(i => i != toRemove);
});

【讨论】:

  • 正如我对@plichard 所说,这是我的错,我说错了。我宁愿在不知道该元素在哪里的情况下删除用户输入的元素
  • @CustyZ01 所以我误解了他们的问题。请参阅我编辑的答案。
  • 感谢您的回答,但这是返回对象吗?例如,我可以这样做:obj = Object.keys(obj).forEach(k => { obj[k] = obj[k].filter(i => i != toRemove); }); 我正在尝试取回对象以更新反应状态(请参阅有问题的编辑)
  • @CustyZ01 这会就地更新obj。如果你愿意,你可以退货。
  • 你可以做obj.b.splice(obj.b.indexOf(5), 1)
【解决方案2】:

要生成具有更新值的新对象,您可以使用Object.entries() 将对象转换为 [key, value] 的条目。映射条目,过滤值数组,然后将条目转换回带有Object.fromEntries()的对象:

const fn = (obj, item) =>
  Object.fromEntries(
    Object.entries(obj)
      .map(([k, v]) => [k, v.filter(o => o !== item)])
  )

const obj = {
  a: [1, 2, 3],
  b: [4, 6],
  c: [7, 8, 9]
}

const result = fn(obj, 5)

console.log(result)

这里有一个小问题,可能会导致不必要的渲染 - 因为我们过滤了所有数组,所以每个数组都是新的,即使该数组开始时不存在该项目。我们可以通过在过滤之前检查数组是否实际包含该项目来解决这个问题。这可能是过早的优化,应该进行分析。

const fn = (obj, item) =>
  Object.fromEntries(
    Object.entries(obj)
      .map(e => e[1].includes(item) ? [e[0], e[1].filter(o => o !== item)] : e)
  )

const obj = {
  a: [1, 2, 3],
  b: [4, 6],
  c: [7, 8, 9]
}

const result = fn(obj, 5)

console.log(result.c === obj.c) // c didn't change

console.log(result)

如果您的环境不支持Object.fromEntries(),您可以轻松地将其替换为基于Array.reduce()的函数:

const fromEntries = entries =>
  entries.reduce((obj, [k, v]) => {
    obj[k] = v
  
    return obj
  }, {})

const fn = (obj, item) =>
  fromEntries(
    Object.entries(obj)
      .map(([k, v]) => [k, v.filter(o => o !== item)])
  )

const obj = {
  a: [1, 2, 3],
  b: [4, 6],
  c: [7, 8, 9]
}

const result = fn(obj, 5)

console.log(result)

【讨论】:

  • 这正是我所期待的。我跑了这是 vanilla js,但是 reactjs undefined is not a function near Object.fromEntries 发生错误是否正常?
  • 所有新浏览器都支持 Object.fromEntries()。 IE 不支持。
  • 用基于reduce的函数替换Object.fromEntries()很容易。我将添加一个示例。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多