2

我正在尝试使用属性名称数组从集合中返回属性的子集。我确信答案在互联网上,但我的词汇量太有限而无法找到。

我的收藏:

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

4

3 回答 3

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 兼容,则需要一个 shim for map或使用 for 循环。

于 2013-05-30T17:20:58.380 回答
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);
于 2013-05-30T17:22:49.510 回答
1

这是一种不使用 push() 或 map() 并使用快速 while -- 循环的快速方法

你的变量

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

或者

这是一个功能版本

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

于 2013-06-03T20:00:27.900 回答