Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当对象键值在数组中时如何筛选数组_Javascript_Angularjs_Angular Filters - Fatal编程技术网

Javascript 当对象键值在数组中时如何筛选数组

Javascript 当对象键值在数组中时如何筛选数组,javascript,angularjs,angular-filters,Javascript,Angularjs,Angular Filters,我的阵列模型如下: records:[{ "empid":1, "fname": "X", "lname": "Y" }, { "empid":2, "fname": "A", "lname": "Y" }, { "empid&quo

我的阵列模型如下:

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"
}
]
var newObj = [];
for(var a = 0 ; a < records.length ; a++){
 if(newArr.indexOf(records[a].empid) > -1){
  newObj.push(records[a]);
 }
}
[{
    "empid": 1,
    "fname": "X",
    "lname": "Y"
}, {
    "empid": 4,
    "fname": "C",
    "lname": "Y"
}, {
    "empid": 5,
    "fname": "C",
    "lname": "Y"
}]
我可以使用
angular
中的
forEach
循环来实现这一点,但因为我的模型对象中有100多条记录。我需要一个如何更好地处理这个问题的建议


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

您可以使用
数组.prototype.filter()


如果​ 这个​<代码>回调​ 返回一个​<代码>真值​ 值,然后​<代码>itm​ 传递给特定的
回调
将被过滤掉。你可以阅读更多关于它的内容。​​​​​​

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

var记录=[{“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],
对象={},
结果;
记录。forEach(功能(a){
对象[a.empid]=a;
});
结果=empid.map(函数(a){
返回对象[a];
});
document.write(“”+JSON.stringify(结果,0,4)+“”)
您可以使用
Array#filter
函数和附加数组来存储排序后的值

[ [ { 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)
});
最快的方式(需要额外的内存):

2019年,使用ES6:

const id=[1,4,5],
数据={
记录:[{
“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));

控制台信息(数据)如果输入数组中有键值对,我使用:

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];
其中输入数组是多个_项,如:[{“text”:“bla1”,“value”:“green”},{“text”:etc.etc}]


_.map是一个lodash函数。

旧方法。很多人可能不喜欢这种方式,但我还是发现在我看来,这种方式更好

输入:

records:[{
    "empid":1,
    "fname": "X",
    "lname": "Y"
},
{
    "empid":4,
    "fname": "C",
    "lname": "Y"
},
{
    "empid":5,
    "fname": "C",
    "lname": "Y"
}
]
var newObj = [];
for(var a = 0 ; a < records.length ; a++){
 if(newArr.indexOf(records[a].empid) > -1){
  newObj.push(records[a]);
 }
}
[{
    "empid": 1,
    "fname": "X",
    "lname": "Y"
}, {
    "empid": 4,
    "fname": "C",
    "lname": "Y"
}, {
    "empid": 5,
    "fname": "C",
    "lname": "Y"
}]
代码:

records:[{
    "empid":1,
    "fname": "X",
    "lname": "Y"
},
{
    "empid":4,
    "fname": "C",
    "lname": "Y"
},
{
    "empid":5,
    "fname": "C",
    "lname": "Y"
}
]
var newObj = [];
for(var a = 0 ; a < records.length ; a++){
 if(newArr.indexOf(records[a].empid) > -1){
  newObj.push(records[a]);
 }
}
[{
    "empid": 1,
    "fname": "X",
    "lname": "Y"
}, {
    "empid": 4,
    "fname": "C",
    "lname": "Y"
}, {
    "empid": 5,
    "fname": "C",
    "lname": "Y"
}]

数据和ID是否已排序?否,数据未排序。。Aravindsamy的解决方案看起来不错。。感谢大家的快速响应……几乎是重复的——虽然在这种情况下情况稍微复杂一些(使用
包括
)'ll这真的很简单@Rajaprabhu,但在大数据(约500-1000)长度数组上执行此操作时,与性能相关的任何信息,@krishnaditya它与for循环非常相似,内部数据将通过使用for循环进行迭代,但这是一种有效的方式。这使得代码更具可读性和可维护性。是的,这看起来还不错。随着哈希键的查找,我也会检查这个。谢谢@NinaThis是最好的答案。一些解释的话会极大地增加JavaScript初学者答案的价值