如何访问javascript对象的多个属性?

时间:2012-05-14 14:38:31

标签: javascript

如果我有阵列:

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]]

3 个答案:

答案 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.ao.c - 没有任何魔法,没有小猫受到伤害!

您还可以使用[]语法:o['a']o['c'] - 但通常只有在您想要访问动态属性名称(即变量而不是引号)时才使用它[]

中的字符串

如果您想要一个包含两个值的数组:

var a_and_c = [o.a, o.c];

现在,您可以使用a_and_c[0][1]来访问这两个值。

答案 1 :(得分:4)

您可以通过两种表示法访问属性:

o.ao.co['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)

关键点:

  1. 迭代对象的[all]对象属性名称(但不是[[prototype]] chain)
  2. 从属性名称
  3. 动态访问值
  4. 属性未订购;如果需要,请排序values,例如
  5. 例如,这可以扩展为添加不同的“排除”规则。它也可以适应不同的高阶函数。

    快乐的编码。