javascript - 如何从多个对象中查找字符串?

标签 javascript reactjs redux react-redux state

我正在尝试通过传递已删除的项目 ID 来更新 Redux reducer 中的状态。 Id 位于任务和关联列中。删除该项目的干净方法是什么?

到目前为止我的 reducer 看起来像这样:

case DELETE_TASK:
  const update =  delete state.tasks[`${action.payload.id}`]
  const findIdCol = ?
  return {

  }


const initState = {
      tasks: {
        "task1": {
          id: "task1",
          content: "hello1"
        },
        "task2": {
          id: "task2",
          content: "hello2"
        },
        "task3": {
          id: "task2",
          content: "hello3"
        }
      },
      columns: {
        "column1": {
          id: "column1",
          taskIds: []
        },
        "column2": {
          id: "column2",
          taskIds: []
        },
        "column3": {
          id: "column3",
          taskIds: ["task3", "task1"]
        }
      },
      main: {
        "main": {
          id: "main",
          taskIds: ["task2"]
        }
      },
      columnOrder: ["column1", "column2", "column3"],
      mainOrder: ["main"]
    };

最佳答案

您可以将列对象转换为其条目,从而允许您循环遍历每个条目您可以使用reduce重新创建列对象:

state.columns = Object.entries(state.columns).reduce((a, [k, v]) => {
  v.taskIds = v.taskIds.filter(taskId => taskId !== action.payload.id)
  a[k] = v
  return a
}, {})

演示:

const state = {
  tasks: {
    task1: { id: 'task1', content: 'hello1' },
    task2: { id: 'task2', content: 'hello2' },
    task3: { id: 'task2', content: 'hello3' }
  },
  columns: {
    column1: { id: 'column1',taskIds: [] },
    column2: { id: 'column2',taskIds: [] },
    column3: { id: 'column3',taskIds: ['task3', 'task1'] }
  },
  main: {
    main: { id: 'main', taskIds: ['task2']}
  },
  columnOrder: ['column1', 'column2', 'column3'],
  mainOrder: ['main']
}


const id = 'task1'

state.columns = Object.entries(state.columns).reduce((a, [k, v]) => {
  v.taskIds = v.taskIds.filter(taskId => taskId !== id)
  a[k] = v
  return a
}, {})

console.log(state)

在这种情况下,您可以将 id 替换为 action.payload.id

如果你想重用这段代码,你可以将它变成一个函数:

const state = {
  tasks: {
    task1: { id: 'task1', content: 'hello1' },
    task2: { id: 'task2', content: 'hello2' },
    task3: { id: 'task2', content: 'hello3' }
  },
  columns: {
    column1: { id: 'column1',taskIds: [] },
    column2: { id: 'column2',taskIds: [] },
    column3: { id: 'column3',taskIds: ['task2', 'task1'] }
  },
  main: {
    main: { id: 'main', taskIds: ['task2']}
  },
  columnOrder: ['column1', 'column2', 'column3'],
  mainOrder: ['main']
}


const id = 'task2'

const removeId = (o, id) => {
  return Object.entries(o).reduce((a, [k, v]) => {
    v.taskIds = v.taskIds.filter(taskId => taskId !== id)
    a[k] = v
    return a
  }, {})
}

state.columns = removeId(state.columns, id)
state.main = removeId(state.main, id)


console.log(state)

关于javascript - 如何从多个对象中查找字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59265763/

相关文章:

javascript - 将参数添加到传递的回调中

javascript - 将查询变量传递给 JavaScript 进行加载 - JavaScript 是否位于这些 API 的后端?

javascript - Openlayers 5 : Modify interaction, 如何获取指向的顶点

javascript - 如果 Knockout 在计算中包装了一个有界函数表达式,为什么它并不总是创建一个依赖项?

javascript - 模块构建失败: SyntaxError: Unexpected token

javascript - 无需订阅即可获取 ngrx 选择器的当前值

reactjs - TypeScript 允许函数作为 React prop 与函数签名的 in-param 冲突吗?

javascript - 在 React.js 中循环并渲染一个对象

javascript - Redux 之前的状态已经有了新的状态值

reactjs - mapDispatchToProps 传递未定义的 props