2017-05-06 2 views
0

나는이 작업을 수행하는 방법을 도움이 필요, 나는 일하러을 가지고 있고 나는 그것의 ID가이 코드처럼, 뭔가 인수에있는 경우 배열에서 수행 할 작업을 위해서 isComplete 속성을 업데이트 할 : completeAllTodos에배열에있는 객체의 ID 속성에 인수 ID가 있는지 확인하는 방법은 무엇입니까?

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); 

내가 원하는이 인수 배열에 ID가있는 객체를 todos로 반환 한 다음 completeAllTodos isComplete 속성을 true로 업데이트합니다. 나 또한 비동기 적으로하고 싶지만 자바 스크립트에서는 새로운 것이다. 나는 몇 시간 동안 그렇게하는 방법을 생각해 왔지만, 내 두뇌가 내가 원하는대로 할 수는 없다. 도움?

+0

:'todoItem.id'이 – Thomas

답변

1

true로 방금 싶어 설정 isCompletes : 당신이 원하는 경우

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); 

이 너무 elems :

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

:

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); 

을 그리고 당신은 모두를 원하는 경우

비동기 구현이 정말로 필요한 경우 (저는 그렇게 생각하지 않습니다) :

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); 
+0

저장 함수의 인수에 대한 유효한 이름이 아닌 내 일. 고맙습니다. –

+0

@iamnewbie youre welcome ☺ –

+0

이 작품은 효과가 있지만 어떻게 줄일 수 있습니까? –

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) 
+0

나는 [... todos, ... completeAllTodos]를 시도했지만, 2 및 3 ID를 사용하여 todos를 덮어 쓰고 싶습니다. –

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);
필터에

+0

하지만 그건 이전 반복의 isComplete를 오버라이드 할 것입니다 ... –

+0

@Jonasw ah yes, correct that that ... fix that updated ... 업데이트 됨 – vol7ron

관련 문제