我需要帮助如何做到这一点,我有todos,如果它的ID在参数中,我想要更新数组中的todos isComplete属性,如下代码:
const todos = [{id: 1, text:"one",isComplete:false},{id:2,text:"two",isComplete:false},{id:3,text:"three",isComplete:false}];
const myArgs = [2,3];
const completeAllTodos = todos.filter(todoItem.id => myArgs.includes(todoItem.id));
completeAllTodos.map( todoItem => todoItem.isComplete = true);
在completeAllTodos上我想返回参数数组中存在ID的todos对象,然后将completeAllTodos isComplete属性更新为true。我也想异步做,但我是javascript的新手。我一直在想如何做好几个小时,但我不能让我的大脑做我想做的事。帮助
答案 0 :(得分:1)
如果您只想将isCompletes设置为true:
const todos = [{id: 1, text:"one",isComplete:false},{id:2,text:"two",isComplete:false},{id:3,text:"three",isComplete:false}];
myArgs = [2,3];
todos.forEach(el=>myArgs.indexOf(el.id)+1?el.isComplete=true:0);
如果你也想要这个元素:
const todos = [{id: 1, text:"one",isComplete:false},{id:2,text:"two",isComplete:false},{id:3,text:"three",isComplete:false}];
myArgs = [2,3];
var result=todos.filter(el=>myArgs.indexOf(el.id)+1).map(el=>!(el.isComplete=true)||el);
如果你想要两个:
const todos = [{id: 1, text:"one",isComplete:false},{id:2,text:"two",isComplete:false},{id:3,text:"three",isComplete:false}];
myArgs = [2,3];
var results=todos.reduce((arr,el)=>myArgs.indexOf(el.id)+1?(el.isComplete=true,arr.push(el),arr):arr);
http://jsbin.com/wopexiwime/edit?console
如果你真的需要一个异步实现(我不这么认为):
function forEach(arr,call,i=0){
if(i>=arr.length){
return;
}
call(arr[i],i);
setTimeout(forEach,0,arr,call,i+1);
}
function filter(arr,call,finalcall,i=0,res=[]){
if(i>=arr.length){
return finalcall(res);
}
if(call(arr[i],i)) res.push(arr[i]);
setTimeout(filter,0,arr,call,finalcall,i+1,res);
}
function map(arr,call,finalcall,i=0,res=[]){
if(i>=arr.length){
return finalcall(res);
}
res.push(call(arr[i],i));
setTimeout(map,0,arr,call,finalcall,i+1,res);
}
map([1,2,3,4],(e,i)=>e+i,console.log);
答案 1 :(得分:1)
这是单向的。
const todos = [{
id: 1,
text: "one",
isComplete: false
}, {
id: 2,
text: "two",
isComplete: false
}, {
id: 3,
text: "three",
isComplete: false
}];
const myArgs = [2, 3];
const completeAllTodos = todos
.filter(todo => {
return myArgs.includes(todo.id)
})
.map(todo => {
todo.isComplete = true
return todo
});
console.log(completeAllTodos)
答案 2 :(得分:1)
在过滤器循环块中完成所有操作:
const todos = [{
id: 1,
text: "one",
isComplete: false
}, {
id: 2,
text: "two",
isComplete: false
}, {
id: 3,
text: "three",
isComplete: false
}];
const args = [2, 3];
const completedTodos = todos.filter(item => args.includes(item.id) && (item.isComplete=true));
console.log(completedTodos);