我正在尝试使用一组属性名称来从集合中返回属性的子集。我确定答案是关于互联网的,但我的词汇量太有限了,无法找到它。
我的收藏:
[
{"name": "sam", "age": 25, "height": 125},
{"name": "jim", "age": 20, "height": 126},
{"name": "bob", "age": 30, "height": 134}
]
我的属性过滤器数组:
["name", "age"]
我的目标是过滤我的原始集合,如下所示:
[
{"name": "sam", "age": 25},
{"name": "jim", "age": 20},
{"name": "bob", "age": 30}
]
有人可以帮我写一个有效的功能吗?我查看了 lodash 库,但无法推断出一个简单的解决方案。我有一种沉闷的感觉,我在这里错过了一些非常简单的事情......
答案 0 :(得分:6)
您可以在现代浏览器上执行此操作:
var input = [
{"name": "sam", "age": 25, "height": 125},
{"name": "jim", "age": 20, "height": 126},
{"name": "bob", "age": 30, "height": 134}
];
var filter = ["name", "age"];
var result = input.map(function(v) {
var o = {};
for (var i=0; i<filter.length; i++) o[filter[i]] = v[filter[i]]
return o;
});
如果你想与ie8兼容,你需要a shim for map或者使用for循环。
答案 1 :(得分:1)
我不知道网上其他地方是否存在已经存在这种情况的内容,但您可以通过以下方式轻松完成:
var collection = [
{"name": "sam", "age": 25, "height": 125},
{"name": "jim", "age": 20, "height": 126},
{"name": "bob", "age": 30, "height": 134}
];
var properties = ["name", "age"];
function filterProperties(col, props) {
var result = [];
for (var i = 0; i < col.length; i++) {
var obj = {};
for (var k = 0; k < props.length; k++) {
obj[props[k]] = col[i][props[k]];
}
result.push(obj);
}
return result;
}
var filtered = filterProperties(collection, properties);
答案 2 :(得分:1)
这是一种不使用push()或map()以及快速while循环
的快速方法你的vars
var a=[
{"name": "sam", "age": 25, "height": 125},
{"name": "jim", "age": 20, "height": 126},
{"name": "bob", "age": 30, "height": 134}
],
b=["name","age"];
快速代码
var c=[],d=a.length,f=b.length;
while(d--){var g=f,e={};while(g--){e[b[g]]=a[d][b[g]]}c[d]=e};
c是你的新数组
OR
这是一个功能版本
// a=pplarray b=filterarray (c,d,e,f,g = placeholder)
function filter(a,b,c,d,e,f,g){
c=[];d=a.length;f=b.length;while(d--){g=f;e={};
while(g--){e[b[g]]=a[d][b[g]]}c[d]=e}return c};
var c=filter(a,b);
c是你的新数组