Javascript使用过滤器/包含在一个对象数组上

时间:2017-10-18 22:04:14

标签: javascript arrays

过滤掉对象中存在的数据的最佳方法是什么?

data只是一个值数组时,我能够使用下面的代码,但现在我需要filter输出我的对象数组中item.QID存在的任何数据

数据对象:

var data = [{
  QID: 'ABC123',
  Name: 'Joe'
},
{
 QID: 'DEF456',
 Name: 'Bob
}]

段:

// I don't want to include data if this QID is in my object
this.employees = emp.filter(item =>!this.data.includes(item.QID));

根据我的理解,includes仅适用于数组,因此我需要将对象中的所有QID值视为数组。

期望的结果:(假设为item.QID = ABC123

this.employees = emp.filter(item =>!this.data.includes('ABC123'));

结果:

var data = [{
  QID: 'DEF456',
  Name: 'Bob'
}]

更新 道歉,我留下了一些不清楚的东西,试图只包括必要的东西。

// People Search
    this.peopleSearchSub = this.typeahead
        .distinctUntilChanged()
        .debounceTime(200)
        .switchMap(term => this._mapsService.loadEmployees(term))
        .subscribe(emp => {
            // Exclude all of the current owners
            this.employees = emp.filter((item) => item.QID !== this.data.QID);
        }, (err) => {
            this.employees = [];
        });

上面的代码就是我正在使用的代码。 data是我希望通过过滤它们从我的预先输入结果中排除的用户的对象。

4 个答案:

答案 0 :(得分:3)

这个问题有点含糊不清,但我的理解(如果我错了,请纠正我)是,您要删除列表emp中与所有项目具有相同QID的所有项目另一个清单data

如果是这种情况,请尝试:

this.employees = emp.filter(item => !this.data.some(d => d.QID === item.QID))

some是一个数组方法,如果任何数组元素的回调都为真,则返回true。因此,在这种情况下,如果列表some(d => d.QID === item.QID)中的任何元素与data具有相同的QID,则item将为真。

答案 1 :(得分:0)

尝试Object#hasOwnProperty()

this.employees = emp.filter(item =>item.hasOwnProperty('QID'));

答案 2 :(得分:0)

您可以使用for ... in循环并过滤掉您想要的内容:

const data = [{
    QID: 'ABC123',
    Name: 'Joe'
},
 {
   QID: 'DEF456',
   Name: 'Bob'
 }]

let newData     = [];
let filterValue = 'ABC123';

for (let value in data) {
  if (data[value].QID !== filterValue) {
    newData.push(data[value]);
  }
}
在这种情况下,

newData将是您新的过滤数组

答案 3 :(得分:0)

您可以使用es6 .filter。我还添加了一些显示已过滤列表的元素和一个允许更改过滤值的输入。单击按钮后,此列表将更新。



const data = [{
    QID: 'ABC123',
    Name: 'Joe'
},
 {
   QID: 'DEF456',
   Name: 'Bob'
 }]

displayData(data);

function displayData(arr) {
  let str = '';
  document.getElementById('filterList').innerHTML = '';

  arr.forEach((i) => { str += "<li>" + i.QID + ": " + i.Name + "</li>"})
  document.getElementById('filterList').innerHTML = str;
}

function filterData() {
let filterValue = document.getElementById('filterInput').value;
filterText (filterValue);
}


function filterText (filterValue) {
  let newArr = data.filter((n) => n.QID !== filterValue); 
  displayData(newArr)
}
&#13;
<input id="filterInput" type="text" value="ABC123" />
<button type ="button" onclick="filterData()">Filter</button>
<hr/>
<ul id="filterList"><ul>
&#13;
&#13;
&#13;