我有以下要用于禁用按钮的React代码:
todos.filter(todo => todo.completed === true)
.map(todo => todo.id)
.includes(this.state.checkedIds)
我的问题是它总是返回false。我想在这里比较两个数组。如果this.state.checkedIds
和todo.ids
两个数组中都有一个项目,则应该返回true
或false
。
答案 0 :(得分:1)
将checkedIds
放入集合中,然后进行比较。
var checkedIds = new Set(this.state.checkedIds)
todos.filter( todo => todo.completed === true )
.map( todo => todo.id )
.filter( id => checkedIds.has(id) )
答案 1 :(得分:1)
假设todo.completed
返回布尔值,您可以将其进一步归结为以下内容。
当然,请将checkedIds
替换为this.state.checkedIds
。
const todos = [
{ id: 1, completed: true },
{ id: 2, completed: false },
{ id: 3, completed: true },
{ id: 4, completed: false }
];
const checkedIds = [1, 2, 4, 5];
const results = todos
.filter(todo => todo.completed)
.map(todo => checkedIds.includes(todo.id));
console.log(results);
答案 2 :(得分:1)
您可以将include与some结合使用以获得简洁
var arr1=[1,2,3,4,5,6,7];
var arr2=[8,9,10];
var arr3=[2,1,3,4,5,6,7];
if(arr1.some((x)=> arr2.includes(x))){
console.log('true');
//do something
}else{
console.log(false);
//do something
};
if(arr1.some((x)=> arr3.includes(x))){
console.log('true');
//do something
}else{
console.log(false);
//do something
};
// something even shorter would be
arr1.some((x)=> arr2.includes(x))?console.log(true):console.log(false)
答案 3 :(得分:0)
你可以使用一个简单的循环:
function arraysIntersect(arr1, arr2) {
for (var i = 0; i < arr1.length; ++i) {
if (arr2.includes(arr1[i])) return true;
}
return false;
}
我认为state.checkedIds
是一个数组。如果这是真的,那么您的代码不起作用,因为您正在检查过滤和映射的待办事项是否包含checkedIds
(它没有),而不是检查它是否包含数组{{1}的任何元素(它可能)。
您可以使用我的代码:
checkedIds
您也可以使用更高级别的数据结构(Alejandro的建议)来解决这个问题,但这可能没有必要(取决于您的代码片段的上下文)。