2017-05-19 41 views
1

假設每個僱員對象的濾光器陣列是具有的javascript:使用另一個數組作爲濾波器

emp1.age=30 
emp1.name="Hang" 
emp2.age=40 
emp2.name="Dang" 
emp3.age=50 
emp3.name="Bang" 

將其存儲在一個陣列對象。我想用另一個字符串數組過濾或拼接數組。

某處我準備名稱的陣列originalArray進行比較,然後從originalArray

var removeElements=["Hang","Dang"] 

我試圖filter刪除不匹配的員工,但它最終發送回調一個字符串,我不能讓它的工作原理

function filterItems(query) { 
    return orginialArray.filter((el) => 
    el.toLowerCase().indexOf(query.toLowerCase()) > -1 
) 
} 
console.log(filterItems(removeElements)); //i know this is wrong 

目標是過濾原始數組,並只有名稱不在remove元素數組中的僱員。

我也試過拼接,但也沒有運氣。

回答

4

您可以使用Array.filter()方法(你已經在使用),並返回true,只有當現有的員工的名字並不在removeNames陣列存在(你可以通過使用Array.indexOf()檢查):

var employees = [ 
 
    {"name": "abc", "age":"34"}, 
 
    {"name": "pqr", "age":"34"}, 
 
    {"name": "xyz", "age":"34"}, 
 
    {"name": "xxx", "age":"34"}, 
 
]; 
 

 
var removeNames = ["xxx"]; 
 

 
// if required, make all removeNames elements lowerCase first 
 
// removeNames = removeNames.map(function(name){ 
 
    // return name.toLowerCase(); 
 
// });//map() 
 

 

 
var filteredEmployees = employees.filter(function(emp){ 
 
    return removeNames.indexOf(emp.name.toLowerCase()) === -1; 
 
});//filter 
 

 
console.log(filteredEmployees);

+1

感謝它的工作:) – NeverGiveUp161

+0

裏面的過濾器,如果我想存儲匹配名稱過濾員工 – NeverGiveUp161

+0

@ NeverGiveUp161對不起,我沒有得到。你的意思是說你想把被移除的員工存儲在一個單獨的數組中嗎?另外,我認爲你應該爲單獨的問題創建一個單獨的問題,因爲它也可以幫助其他人。 –

3

你很近。由於query是名稱的數組,你需要檢查,如果當前的僱員的名字是數組中 - 如果是這樣,從新列表中排除該員工,像這樣:

var emp1 = { 
 
    age: 30, 
 
    name: "Hang" 
 
}; 
 
var emp2 = { 
 
    age: 40, 
 
    name: "Dang" 
 
}; 
 
var emp3 = { 
 
    age: 50, 
 
    name: "Bang" 
 
}; 
 

 
var originalArray = [emp1, emp2, emp3]; 
 
var removeElements = ["hang", "bang"]; 
 
function filterItems(query) { 
 
    return originalArray.filter((employee) => 
 
    query.indexOf(employee.name.toLowerCase()) === -1 
 
) 
 
} 
 
console.log(filterItems(removeElements));

+1

這個答案沒有問題,我個人也沒有失望。我的猜測是,你可能會因爲它沒有遵循功能範例而得到低估。 – zfrisch

+0

@doutriforce答案沒有錯,我沒有downvote,我並不反對你,可能會有所幫助,但正如我所說,我認爲誰downvoted沒有找到有用的答案,他們不我不能解釋爲什麼,因爲我確信如果他們覺得這對他們是值得的,他們會留下評論。 – Nope

+2

@zfrisch我同意,我的嘗試是保持代碼儘可能接近OP的原始代碼。 – mhodges

0

這是完全ES6陣列方法解決方案。你可以這樣做:

filterItems(query){ 
    let newArray = [] 
    query.map((qElem) => newArray.push(qElem.toLowerCase())) 
    return originalArray.filter((el) => 
     newArray.includes(el.toLowerCase()) 
    ) 
} 

我正在生成一個新的數組與查詢名稱,但小寫。然後返回一個新數組,其中包含所有不滿足被包含在newArray中的條件的元素。 希望它有幫助!