如何检查数组中是否存在另一个数组中的项目?

时间:2017-06-07 17:51:28

标签: javascript arrays reactjs

我有以下要用于禁用按钮的React代码:

todos.filter(todo => todo.completed === true)
  .map(todo => todo.id)
  .includes(this.state.checkedIds) 

我的问题是它总是返回false。我想在这里比较两个数组。如果this.state.checkedIdstodo.ids两个数组中都有一个项目,则应该返回truefalse

4 个答案:

答案 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的建议)来解决这个问题,但这可能没有必要(取决于您的代码片段的上下文)。