【问题标题】:Filtering an array using reduce使用 reduce 过滤数组
【发布时间】:2021-07-17 09:14:14
【问题描述】:

所以我想使用 Array.prototype.reduce 函数来减少一些数组(从对象转换)。

这是我稍后将使用 Object.entries 获取数组的对象。

const activityLoading = {
  topicsForClassCourse: true,
  b: false,
  c: false,
  d: true,
  e: false
}

我还有一个键数组,我想在减少这个对象时忽略它们。因此,activityLoading 中的任何键以及本地键都将被忽略。

const local = [ "topicsForClassCourse", "e" ]

现在我想将对象缩减为单个值。如果除本地数组中的键之外的任何键为真,则它应返回真,否则返回假。

这是我能想到的。但它返回 false。

const loadingSome = () => {
      const local = [ "topicsForClassCourse", "timetableForClass" ];
      const entries = Object.entries(activityLoading)
      
      const reducer = (acc, current) => {
        if(local.includes(current[0])) {
          return false
        }
        if(current[1]) {
          return true;
        }
        return false
      }
      
      const result = entries.reduce(reducer, false)
      console.log(result)
    }

https://jsbin.com/nolobupeva/edit?js,console

【问题讨论】:

  • reduce 在目标为布尔值时不是正确的函数,请使用some 或every
  • 也许你是对的......使用一些会更有意义。

标签: javascript arrays sorting reducers


【解决方案1】:

你应该尝试一些更简单的工作,使用 reduce 函数来掌握它。现在对于您的问题,您可以试试这个:

    const loadingSome = () => {
      const local = [ "topicsForClassCourse", "timetableForClass" ];
      const entries = Object.entries(activityLoading)
      
      const reducer = (acc, current) => {
        if(local.includes(current[0])) {
          return acc
        }
        return current[1] || acc;
      }
      
      const result = entries.reduce(reducer, false)
      console.log(result)
    }

如您所见,您忘记将acc 考虑在内。我没有尝试过上面的代码,但它应该可以工作。如果没有让我知道。

【讨论】:

  • 谢谢。我认为您的代码使我更容易理解。我没想过这样使用 acc。
【解决方案2】:

基本上,我会开始为单个值本身编写测试

function test(key, value) {
  const ignore = local.includes(key)
  return !ignore && value
}

一旦你有了它,就有很多方法可以在你的整个对象上运行它。而且我不确定.reduce 是不是最好的方法。我建议去.find

const activityLoading = {
  topicsForClassCourse: true,
  b: false,
  c: false,
  d: true,
  e: false
}
const local = [ "topicsForClassCourse", "e" ]

const result = Object.entries(activityLoading).find(([key, value]) => {
  const ignore = local.includes(key)
  return !ignore && value
})
console.log(result) // ['d', true]

const foundSomething = !!result
console.log(foundSomething) // true

如果您发现处理返回的['d', true] 很麻烦,使用.some 而不是.find 将返回一个布尔值而不是与测试匹配的值。

但如果你真的想要,.reduce 也可以完成这项工作,只需注意两件事:

  • 如何初始化它(第二个参数)。它应该从 false 开始,因为最初您假设没有值匹配。
  • 以及如何累积(返回)。它应该是 return accumulator || current,以便 any true current 将产生整个结果 true。

const activityLoading = {
  topicsForClassCourse: true,
  b: false,
  c: false,
  d: true,
  e: false
}
const local = [ "topicsForClassCourse", "e" ]

const result = Object.entries(activityLoading).reduce((accu, [key, value]) => {
  const ignore = local.includes(key)
  const test = !ignore && value
  return accu || test
}, false)

console.log(result) // true

【讨论】:

    【解决方案3】:

    如何首先过滤对象以使用filter 过滤掉local 数组键,然后使用some 检查任何键是真/假。

    const activityLoading = {
      topicsForClassCourse: true,
      b: false,
      c: false,
      d: true,
      e: false
    };
    const local = ["topicsForClassCourse", "e"];
    let result = Object.entries(activityLoading)
      .filter(([key, value]) => !local.includes(key))
      .some(([key, value]) => value);
    console.log(result);

    或者你只能使用some数组助手

    const activityLoading = {
      topicsForClassCourse: true,
      b: false,
      c: false,
      d: true,
      e: false
    };
    const local = ["topicsForClassCourse", "e"];
    let result = Object.entries(activityLoading)
      .some(([key, value]) => !local.includes(key) && value)
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2023-01-02
      相关资源
      最近更新 更多