【问题标题】:Setting variables from within a map从地图中设置变量
【发布时间】:2023-04-07 04:40:01
【问题描述】:

我有以下代码:

let pa = 0;
let pw = 0;
let pc = 0;
let pi = 0;
let pr = 0;

this.state.array.data.map((i) => {
  if (i.mdn === this.queryParams.mdn && i.sources != null) {
    return (i.sources.map((sources) => {
      if (sources.source.toString().toLowerCase() === "a") {
        pa = sources.t.sessions.u
      }
      if (sources.source.toString().toLowerCase() === "w") {
        pw = sources.t.sessions.u
      }
      if (sources.source.toString().toLowerCase() === "c") {
        pc = sources.t.sessions.u
      }
      if (sources.source.toString().toLowerCase() === "i") {
        pi = sources.t.sessions.u
      }
      if (sources.source.toString().toLowerCase() === "r") {
        pr = sources.t.sessions.u
      }
    }))
  }
},

this.setState({
  web: [],
  app: [],
  preference: [{a: pa}, {w: pw}, {c: pc}, {i: pi}, {r: pr}]
}),

一旦我设置状态,它实际上并没有设置它,它只需要 0 并在那里抛出 throws。

【问题讨论】:

  • 修改状态的地图是个坏主意。您可能应该改用forEach。 Map 应该返回一个新数组而不影响其余代码。目前的代码非常混乱。
  • 结合@JuanMendes 的建议,您可以通过用开关替换您的if 语句来真正使这更简洁。它可以让你用 1 替换你所有的 ...toString().toLowerCase() 调用。
  • 你正在设置一个全局变量...preferenceApp 其他都是全局的
  • i.sources.map((sources) - 您有名为 sources 的参数,并且您在 sources 上调用 map。您应该将参数更改为 source 或不同的值。
  • @EvanBechtol 不是每个人都同意你的观点,switch 更干净,你需要在那里添加所有的休息时间。话虽如此,他们至少应该是if/elses 以使其更清晰

标签: javascript reactjs


【解决方案1】:

不要使用Array.prototype.map,而是尝试Array.prototype.forEach并按键设置偏好对象。

要保留键的顺序,请创建所需顺序的数组。

let order = [ 'a', 'w', 'c', 'i', 'r' ];
    preference = {
      a : 0,
      w : 0,
      c : 0,
      i : 0,
      r : 0 
    };

this.state.array.data.forEach((item) => {
  if (item.mdn === this.queryParams.mdn && item.sources != null) {
    return item.sources.forEach((entry) => {
      var key = entry.source.toString().toLowerCase();
      preference[key] = entry.t.sessions.u;
    });
  }
});

this.setState({
  web: [],
  app: [],
  preference: order.map(key => ({ [key] : preference[key] }));
}),

【讨论】:

    【解决方案2】:

    我在这里做出很大的假设,因为您从未提供过输入,而我只是在讨论您在 cmets 中提到的事情。

    我现在真正认为应该是一个简单的发现和一张地图

    const lookup = []
    const data = this.state.array.data
    
    const content = data.find(obj => obj.mdn === this.queryParams.mdn && obj.sources
    let preferences = defaultValues //<-- define defaultValues
    if (content) {
      preferences = content.sources.map(({source, t}) =>
        ({ [lookup[source.toLowerCase()]] : t.sessions.u })
    }
    this.setState({ preferences })
    

    如果 mdn 可以包含多个,则需要 forEach 和其他一些附加逻辑。

    【讨论】:

      【解决方案3】:

      正如胡安·门德斯指出的那样;如果每个变量只能找到一项,您可以简单地使用特定于该变量的查找操作。对于每个变量,它看起来像这样;

      const someArray = [{ property: "a", text: "lorem"}, { property: "b", text: "ipsum"}]
      
      const pa = someArray.find(function(item) {
        return item.property === 'a'
      })
      
      console.log(pa)

      如果您没有确切的一次查找操作;使用 Array.forEach() 而不是 Array.map(),因为 map 中的回调应该返回一个值,而您可以使用 forEach 修改(不同的)变量。

      例如:

      let pa = 0
      
      const someArray = ['lorem', 'ipsum', 'dolor']
      someArray.forEach(function(word) {
        pa = word
      })
      
      console.log(pa)

      【讨论】:

      • 这是一个很好的建议,但不能解决问题,是吗?
      • 确实如此,因为(在 OP 中没有显示更多代码)我假设 setState() 实际上并没有损坏。因为它通常是 react 或其他库的一部分。
      • 我认为这个答案没有足够的 OP 代码来真正表明它确实回答了所提出的问题。问题不在于setState 电话,而更多地与地图有关。
      • OP 的帖子明确指出:“一旦我设置状态,它实际上并没有设置它,它只需要 0 并在那里抛出 throws。”
      • 这不是一个很好的例子,应该是const ba = someArray.find(work =&gt; someCondition(word))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      相关资源
      最近更新 更多