use*_*689 10 javascript arrays
我有一个像下面的javascript结构(嵌套的对象数组)
var categoryGroups = [
{
Id: 1, Categories: [
{ Id: 1 },
{ Id: 2 },
]
},
{
Id: 2, Categories: [
{ Id: 100 },
{ Id: 200 },
]
}
]
Run Code Online (Sandbox Code Playgroud)
我想找到一个匹配Id的子类别对象,假设类别ID都是唯一的.
我在下面有这个,但是想知道是否有更简洁的方法:
var category, categoryGroup, found = false;
for (i = 0; i < categoryGroups.length ; i++) {
categoryGroup = categoryGroups[i];
for (j = 0; j < categoryGroup.Categories.length; j++) {
category = categoryGroup.Categories[j];
if (category.Id === id) {
found = true;
break;
}
}
if (found) break;
}
Run Code Online (Sandbox Code Playgroud)
mli*_*nau 10
在 ES2019 中使用flatMap
const category = categoryGroups.flatMap(cg => cg.Categories).find(c => c.Id === categoryId);
Run Code Online (Sandbox Code Playgroud)
警告:这使用了一些Array.prototype仅在ECMAScript 5中添加的功能,因此除非您对它们进行填充,否则将无法使用旧版浏览器.
您可以遍历数组中的所有第一级对象,然后根据条件过滤类别并收集数组中的所有匹配项.您的最终结果将是匹配数组中的第一个元素(如果数组为空,则找不到匹配项).
var matches = [];
var needle = 100; // what to look for
arr.forEach(function(e) {
matches = matches.concat(e.Categories.filter(function(c) {
return (c.Id === needle);
}));
});
console.log(matches[0] || "Not found");
Run Code Online (Sandbox Code Playgroud)
JSFiddle: http ://jsfiddle.net/b7ktf/1/
参考文献:
Array.prototype.forEach
Array.prototype.concat
Array.prototype.filter
仅使用Array.prototype.filter():
如果您确定您要查找的 id 存在,您可以执行以下操作:
var id = 200; // surely it exists
var category = arr.filter(g => g.Categories.filter(c => c.Id === id)[0])[0].Categories.filter(c => c.Id === id)[0];
Run Code Online (Sandbox Code Playgroud)
如果您不确定它是否存在:
var id = 201; // maybe it doesn't exist
var categoryGroup = arr.filter(e => e.Categories.filter(c => c.Id === id)[0])[0];
var category = categoryGroup ? categoryGroup.Categories.filter(c => c.Id === id)[0] : null;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22249 次 |
| 最近记录: |