我有一个数组模型如下:
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条记录。我需要一个关于如何更好地处理这个问题的建议。
我正在考虑创建一个自定义过滤器,但您对此有何看法。(如果是,请提供示例代码来实现此目的。)
感谢您的帮助。
感谢。
答案 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"
}]