JavaScript - reduce 示例的解释

JavaScript - Explanation of reduce example

这是我在 Whosebug 上的第一个问题(如果我做错了什么 - 抱歉!)

我有一个reducer函数,是我老师帮助我的,我真的能理解它的意思。 这是一个待办事项应用程序,我有一个按钮。当按下按钮时,待办事项列表中的所有项目都应标记为已完成。当我再次按下按钮时,所有项目都应该未完成。

我得到了大部分代码。我无法理解的一个部分是项目数组 !store.items.find 之前的解释标记。 如果有人能给出解释,我将不胜感激! 如果您需要我分享更多代码,也请告诉我。

completeAllTodo: (store, action) => {
    const areAllTasksCompleted = !store.items.find(todo => !todo.isComplete)
    if (areAllTasksCompleted) {
        const completedItems = store.items.map(todo => {
            return {
                ...todo,
                isComplete: false
            }
        })
        store.items = completedItems
    } else {
        const completedItems = store.items.map(todo => {
            return {
                ...todo,
                isComplete: true
            }
        })
        store.items = completedItems
    }
},

Array#find 将 return 匹配项目的数组,否则 returns undefined.

因此,如果有一些未完成的待办事项 find 将 return 一个数组并且取反该数组将导致 false,如果没有未完成的待办事项,它将 return ] undefined 并否定 undefined 将导致 true.

考虑以下代码片段:

const todo = [
  { task: "Exercise", isComplete: true },
  { task: "Buy Grocery", isComplete: false },
];

// There is one incomplete todo in the above todo array
const resultFromFind = todo.find(t => !t.isComplete);
console.log(resultFromFind); // { task: 'Buy Grocery', isComplete: false }

const allComplete = !resultFromFind
console.log(allComplete) // false

const todo = [
  { task: "Exercise", isComplete: true },
  { task: "Buy Grocery", isComplete: true },
];

// There is no incomplete todo in the above todo array
const resultFromFind = todo.find(t => !t.isComplete);
console.log(resultFromFind); // undefined

const allComplete = !resultFromFind
console.log(allComplete) // true

store.items.find(todo => !todo.isComplete)

表示查找任何尚未完成的项目,如果没有这样的项目,则 find 将 return 未定义,因此

!store.items.find(todo => !todo.isComplete) 

意味着如果有一个项目没有完成,那么这将是错误的,如果所有项目都完成,那么 find 将 return 未定义,并且整个表达式将为真

表达相同逻辑的更好方法是

const areAllTasksCompleted = store.items.every(todo => todo.isComplete)

const areAllTasksCompleted = !store.items.find(todo => !todo.isComplete)

store.items.find return 是匹配谓词回调条件的第一项。

todo => !todo.isComplete 是你的谓词回调,它传递一个参数(迭代中的当前项目)和 returns true 如果项目不完整(或 false 如果完成的话)。

因此,此表达式将return数组中第一个未完成元素的值。

整个表达式前的!取反表达式的结果。在 JavaScript 中,任何对象值都将被强制转换为 true,而 nullundefined 值将被强制转换为 false,因此如果表达式找到匹配谓词的值,你的const将被分配给false,否则它将是true.