javascript:使用另一个数组作为过滤器过滤对象数组

时间:2017-05-19 15:08:29

标签: javascript arrays filter ecmascript-6

假设每个员工都是

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

将其存储在Array中。

var orginialArray=[emp1,emp2,emp3];

我想用另一个字符串数组过滤或拼接数组。

某处我准备了一系列与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元素数组中的员工。

我也试过拼接,但也没有运气。

3 个答案:

答案 0 :(得分:5)

您可以使用Array.filter()方法(您已经在使用)并且仅当removeNames数组中不存在当前员工姓名时才返回true(您可以使用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 :(得分: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));

答案 2 :(得分:0)

这是一个完全ES6阵列方法的解决方案。你可以这样做:

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

我正在使用查询名称生成一个新数组,但是小写。然后返回一个新数组,其中所有元素都不满足newArray中包含的条件。 希望它有所帮助!