如果我有数组:
my_array = [{a:3,b:4,c:7},{a:5,b:8,c:6}]
property_names = ["a","c"]
如何针对 my_array 使用 property_names 数组来获得以下输出?:
subset_array = [[3,7],[5,6]]
如果我有数组:
my_array = [{a:3,b:4,c:7},{a:5,b:8,c:6}]
property_names = ["a","c"]
如何针对 my_array 使用 property_names 数组来获得以下输出?:
subset_array = [[3,7],[5,6]]
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]
and[1]
访问这两个值。
您可以通过两种表示法访问属性:
要么o.a
和o.c
要么o['a']
和o['c']
。
编辑
如果您想创建一个包含这两个值的新数组,那么只需使用 @Reid 建议的代码即可:
[o.a, o.c]
第二次编辑
因此,只需在函数内部构建数组,map
如下所示:
变种过滤器= [“a”,“c”,“f”,“zzz”];// 应该
子集数组 = my_array.map( 函数 (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
或调整值。
这不是一个完整的答案,但我相信它会有用:
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
例如,如果需要,排序例如,这可以扩展以添加不同的“排除”规则。它也可以适应不同的高阶函数。
快乐编码。