从集合中选择某些属性

时间:2013-05-30 17:18:21

标签: javascript arrays

我正在尝试使用一组属性名称来从集合中返回属性的子集。我确定答案是关于互联网的,但我的词汇量太有限了,无法找到它。

我的收藏:

[
  {"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 库,但无法推断出一个简单的解决方案。我有一种沉闷的感觉,我在这里错过了一些非常简单的事情......

3 个答案:

答案 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是你的新数组