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

IT技术 javascript angularjs angular-filters
2021-01-25 15:03:06

我有一个数组模型如下:

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 多条记录。我需要一个关于如何以更好的方式处理这个问题的建议。

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

6个回答

你可以这样做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传递给特定的callBack将被过滤掉。你可以在这里阅读更多相关信息

@KrishnaAditya 它与 for 循环非常相似,内部数据将通过使用 for 循环进行迭代,但以一种有效的方式进行。这使代码更具可读性和可维护性。
2021-03-20 15:03:06
这真的很简单@Rajaprabhu,但是在大数据(大约 500-1000)长度数组上执行此操作时,任何与性能相关的信息,
2021-03-29 15:03:06

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 );

对于 JavaScript 初学者来说,一些解释会极大地增加你的答案的value。;)
2021-04-02 15:03:06

这是使用临时对象的快速解决方案。

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>');

是的,这甚至看起来不错。更有可能作为哈希键查找,我也会检查这个。谢谢@尼娜
2021-03-21 15:03:06

您可以使用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' } ] ]

最快的方式(需要额外的内存):

var empid=[1,4,5]
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 empIdObj={};

empid.forEach(function(element) {
empIdObj[element]=true;
});

var filteredArray=[];

records.forEach(function(element) {
if(empIdObj[element.empid])
    filteredArray.push(element)
});