当对象键值在数组中时如何过滤数组

时间:2016-03-05 17:48:42

标签: javascript angularjs angular-filters

我有一个数组模型如下:

records:[{
    "empid":1,
    "fname": "X",
    "lname": "Y"
},
{
    "empid":2,
    "fname": "A",
    "lname": "Y"
},
{
    "empid":3,
    "fname": "B",
    "lname": "Y"
},
{
    "empid":4,
    "fname": "C",
    "lname": "Y"
},
{
    "empid":5,
    "fname": "C",
    "lname": "Y"
}
]

现在我有一个empid的[1,4,5]数组。

所以现在我需要过滤包含我第二个中所有键的第一个数组。

输出:

records:[{
    "empid":1,
    "fname": "X",
    "lname": "Y"
},
{
    "empid":4,
    "fname": "C",
    "lname": "Y"
},
{
    "empid":5,
    "fname": "C",
    "lname": "Y"
}
]

我可以使用forEach中的angular循环执行此操作,但因为我的模型对象中有超过100条记录。我需要一个关于如何更好地处理这个问题的建议。

我正在考虑创建一个自定义过滤器,但您对此有何看法。(如果是,请提供示例代码来实现此目的。)

感谢您的帮助。

感谢。

7 个答案:

答案 0 :(得分:30)

您可以使用Array.prototype.filter()

执行此操作
var data = { records : [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }] }
var empIds = [1,4,5]
var filteredArray = data.records.filter(function(itm){
  return empIds.indexOf(itm.empid) > -1;
});

filteredArray = { records : filteredArray };

如果callBack返回true值,则会过滤掉传递给该特定itm的{​​{1}}。您可以阅读更多相关信息here

答案 1 :(得分:1)

这是一个带有临时对象的快速解决方案。

var records = [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }],
    empid = [1, 4, 5],
    object = {},
    result;

records.forEach(function (a) {
    object[a.empid] = a;
});

result = empid.map(function (a) {
    return object[a];
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

答案 2 :(得分:1)

您可以使用Array#filter函数和其他数组来存储排序值;

var recordsSorted = []

ids.forEach(function(e) {
    recordsSorted.push(records.filter(function(o) {
        return o.empid === e;
    }));
});

console.log(recordsSorted);

结果:

[ [ { empid: 1, fname: 'X', lname: 'Y' } ],
  [ { empid: 4, fname: 'C', lname: 'Y' } ],
  [ { empid: 5, fname: 'C', lname: 'Y' } ] ]

答案 3 :(得分:1)

最快的方式(会占用额外的记忆):

if content[indexPath.row].urgent = true {
        cell.urgentLabel.text = "URGENT"
    } else {
        cell.urgentLabel.text = ""
    }

答案 4 :(得分:0)

在2019年使用ES6:

const ids = [1, 4, 5],
  data = {
    records: [{
      "empid": 1,
      "fname": "X",
      "lname": "Y"
    }, {
      "empid": 2,
      "fname": "A",
      "lname": "Y"
    }, {
      "empid": 3,
      "fname": "B",
      "lname": "Y"
    }, {
      "empid": 4,
      "fname": "C",
      "lname": "Y"
    }, {
      "empid": 5,
      "fname": "C",
      "lname": "Y"
    }]
  };


data.records = data.records.filter( i => ids.includes( i.empid ) );

console.info( data );

答案 5 :(得分:0)

如果您的输入数组中有键值对,我会使用:

.filter(
          this.multi_items[0] != null && store.state.isSearchBox === false
            ? item =>
                _.map(this.multi_items, "value").includes(item["wijknaam"])
            : item => item["wijknaam"].includes("")
        );

其中输入数组是multi_items,例如:[{“ text”:“ bla1”,“ value”:“ green”},{“ text”:等等,等等。]

_。map是lodash函数。

答案 6 :(得分:0)

过去的做法。许多人可能讨厌这种做法,但我仍然有很多时候发现在我看来这仍然更好。

输入:

var records = [{
    "empid":1,
    "fname": "X",
    "lname": "Y"
},
{
    "empid":2,
    "fname": "A",
    "lname": "Y"
},
{
    "empid":3,
    "fname": "B",
    "lname": "Y"
},
{
    "empid":4,
    "fname": "C",
    "lname": "Y"
},
{
    "empid":5,
    "fname": "C",
    "lname": "Y"
}
]

var newArr = [1,4,5];

代码:

var newObj = [];
for(var a = 0 ; a < records.length ; a++){
 if(newArr.indexOf(records[a].empid) > -1){
  newObj.push(records[a]);
 }
}

indexOf() 方法返回可以在数组中找到给定元素的第一个索引,如果不存在,则返回 -1。

参考 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

输出:

[{
    "empid": 1,
    "fname": "X",
    "lname": "Y"
}, {
    "empid": 4,
    "fname": "C",
    "lname": "Y"
}, {
    "empid": 5,
    "fname": "C",
    "lname": "Y"
}]