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初学者答案的价值