如果我有阵列:
my_array = [{a:3,b:4,c:7},{a:5,b:8,c:6}]
property_names = ["a","c"]
如何使用property_names数组对my_array获取以下输出?:
subset_array = [[3,7],[5,6]]
答案 0 :(得分:9)
var my_array = [{a:3,b:4,c:7}, {a:5,b:8,c:6}];
var keys = ['a', 'c'];
my_array.map(function(d){
return keys.map(function(k) {
return d[k];
});
});
这会给你[[3, 7], [5, 6]]
,而且似乎正是你想要的。
[过时的初步答案;在OP更新他的问题之前]
使用o.a
和o.c
- 没有任何魔法,没有小猫受到伤害!
您还可以使用[]
语法:o['a']
和o['c']
- 但通常只有在您想要访问动态属性名称(即变量而不是引号)时才使用它[]
)
如果您想要一个包含两个值的数组:
var a_and_c = [o.a, o.c];
现在,您可以使用a_and_c[0]
和[1]
来访问这两个值。
答案 1 :(得分:4)
您可以通过两种表示法访问属性:
o.a
和o.c
或o['a']
和o['c']
。
修改强>
如果你想创建一个包含两个值的新数组,那么只需使用例如@Reid建议的代码:
[o.a, o.c]
第二次编辑
所以只需在map
函数内部构建数组,如下所示:
var filter = [“a”,“c”,“f”,“zzz”]; //应该
subset_array = my_array.map(function(v){ var newArr = [];
for( var i=0; i<filter.length; ++i ) {
if ( typeof v[ filter[i] ] !== 'undefined' ) {
newArr.push( v[ filter[i] ] );
}
}
return newArr;
});
但有一点需要注意的是,只要您使用原始类型(如示例中的int值),上面的代码就会克隆属性。这意味着,如果您在某个时间点更改my_array
中的值,subset_array
将不隐式更改,但您必须重新创建subset_array
或调整值那里也是。
答案 2 :(得分:1)
这不是一个完整的答案,但我相信它会有用:
var values = []
var obj = {a: 1, b: 2, c: 3}
for (var prop in obj) {
if (obj.hasOwnValue(prop)) { // skip props in [[prototype]], no effect here
values.push(obj[prop])
}
}
values // -> [2, 1, 3] (in SOME UNDEFINED ORDER)
关键点:
values
,例如例如,这可以扩展为添加不同的“排除”规则。它也可以适应不同的高阶函数。
快乐的编码。