如何使用数组作为对象参数之一过滤对象数组?

时间:2017-10-17 11:38:39

标签: javascript arrays typescript

我有这个对象:

this.contacts = [
            {
                name: "",
                el: ["one", "two"]
            },
            {
                name: "",
                el: ["three", "four"]
            }]

如何过滤以上内容,例如,当我搜索"两个"?

时,只返回第一个对象

到目前为止我的尝试:

filterItems(searchTerm) {

    return this.contacts.filter((item) => {
        return item.el.filter((user) => {
            return user.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1;
        })
    });

}

当然没有任何回报,为什么?

3 个答案:

答案 0 :(得分:2)

您可以使用Array#includes并将其视为过滤条件。



function filterItems(user) {
    return this.contacts.filter(item => item.el
        .map(s => s.toLowerCase())
        .includes(user.toLowerCase()))
}

var contacts = [{ name: "", el: ["one", "two"] }, { name: "", el: ["thrEE", "four"] }];

console.log(filterItems('THREE'));

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

在第一个.filter内,你应该使用.some

var contacts = [{
    name: "",
    el: ["one", "two"]
  },
  {
    name: "",
    el: ["three", "four"]
  }
]

filterItems = function(searchTerm) {
  return contacts.filter((item) => {
    return item.el.some((user) => {
      return user.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1;
    })
  });
}

console.log(filterItems("two"))
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

如果您希望获得类似的效果,但通过使用循环,您可以使用以下功能:

function filterItems(search) {
    for(let i = 0; i < this.contacts.length; i++) {
        let obj = this.contacts[i];
        for(let j = 0; j < obj.el.length; j++) {
            if(obj.el[j] === search) return i;
        }
    }
}

console.log(filterItems("two")); // logs 0 (returns 0) 
console.log(filterItems("four")); // logs 1 (returns 1)

基本上,第一个循环用于遍历您的contacts数组。然后第二个用于遍历el属性中的数组。然后在el数组的每次迭代时,我们可以检查我们当前所在的数组元素是否等于传递search值,因此如果匹配则返回true

工作示例:https://jsfiddle.net/knLbL9b5/(检查控制台输出)