如何将对象属性作为参数传递? (JavaScript)

Posted

技术标签:

【中文标题】如何将对象属性作为参数传递? (JavaScript)【英文标题】:How to pass an object property as a parameter? (JavaScript) 【发布时间】:2012-11-25 11:02:36 【问题描述】:

我不确定标题是否适合我想要实现的目标

我将 JSON 结果映射到一个数组。因为我需要一遍又一遍地这样做,所以我想将代码放入一个函数中。

在以下示例中,我正在重复自己。我有名为 item.data1, item.data2 的属性,在第二个示例中 item.something1, item.something2 ...我如何将这些属性作为“通用”参数传递给新创建的函数,以便在那里使用它们而不是重复自己返回那些地图?新函数应该可用于以下两个示例以及属性可能具有不同名称的其他情况。

service.getData(function(data) 
    var map = ;
    map = $.map(data, function(item, i) 
        var entry = ;

        entry.key = item.data1;
        entry.value = item.data2;

        return entry;
    );
);

service.getSomething(function(data) 
    var map = ;
    map = $.map(data, function(item, i) 
        var entry = ;

        entry.key = item.something1;
        entry.value = item.something2;

        return entry;
    );
);

【问题讨论】:

return key:item.something1, value:item.something2 【参考方案1】:

使用带有字符串的[] 动态地从对象中提取属性。

var a =  foo: 123 ;
a.foo    // 123
a['foo'] // 123

var str = 'foo';
a[str]   // 123

这意味着我们可以像这样重构您的方法,只需将您想要读取的属性的名称作为字符串传递。

var getKeyValueMap = function(data, keyPropName, valuePropName) 
  return $.map(data, function(item, i) 
    return 
      key:   item[keyPropName],
      value: item[valuePropName]
    
  );
;

service.getData(function(data) 
  return getKeyValueMap(data, 'data1', 'data2');
);

service.getSomething(function(data) 
  return getKeyValueMap(data, 'something1', 'something2');
);

【讨论】:

谢谢亚历克斯。我开始认为 javascript 来自盟友很强大 如果密钥只有一层或两层怎么办?如何通过参数传递密钥? 你继续钻进去! obj[propA][propB][propC]【参考方案2】:

这可以使用[] 运算符而不是.-notation 来完成,就像in this fiddle ive created just for you :D:

    var data = [
        data1: 'foo',
        data2: 'bar',
        something1: 'sparky',
        something2: 'arf arf!',
    
        data1: 'My name is',
        data2: 'What?',
        something1: 'my name is',
        something2: 'Who?!'
    ];

    function test(data, prop) 
        var d_length = data.length;
        for (var i = 0; i < d_length; i++) 
            alert(data[i][prop]);
        
    

    test(data, 'data1');

【讨论】:

【参考方案3】:

您需要将item 对象和item-keys 映射传递给entry-keys。这可以是两个数组,一个元组数组或其他东西,或者一个对象。我能想到的最简单的方法是将描述符对象更改为条目本身:

function mapPropertyNames(source, dest) 
    for (var prop in dest)
        dest[prop] = source[dest[prop]];
    return dest;


// and use it like this:

var map = $.map(data, function(item, i) 
    return mapPropertyNames(item, key:"something1", value:"something2");
);

【讨论】:

【参考方案4】:

有点像

service.getData(function(data) 
    var map = ;
    var varNamePrefix = 'data';
    map = $.map(data, function(item, i) 
        return getProperties(item, varNamePrefix);
    );
);

service.getSomething(function(data) 
    var map = ;
    var varNamePrefix = 'something';
    map = $.map(data, function(item, i) 
        return getProperties(item, varNamePrefix);
    );
);

function getProperties(item, varNamePrefix) 
    var ret = ;
    ret.key = item[varNamePrefix + '1'];
    ret.value = item[varNamePrefix + '2'];
    return ret;

有帮助吗?

基本上,您可以使用一个函数,该函数接受一个属性前缀并使用它来形成实际的属性名称以从项目中获取。

【讨论】:

【参考方案5】:

试试这个:

service.getData(function(data, props) // props is a property object
    var map = ;
    map = $.map(data, function(item, i) 
        var entry = ;

        for (var key in props) 
            entry[key] = item[key]
        

        return entry;
    );
);

或使用属性数组

service.getData(function(data, props) // props is like ['data1', 'data2']
    var map = ;
    map = $.map(data, function(item, i) 
        var entry = ;

        for (var j = 0, k = props.length; j < k; j++) 
            entry[props[j]] = item[props[j]]
        

        return entry;
    );
);

【讨论】:

“属性对象”到底是什么意思? @Bergi 一个对象包含所需的属性,例如:data1: 1, data2: 1 这不适用于"key" != "data1" - OP 希望重命名属性。顺便说一句,你的数组答案更有意义...... 关键是把属性作为参数传给函数,每次可以给不同的值,参数的类型不重要,选择你认为方便的一个

以上是关于如何将对象属性作为参数传递? (JavaScript)的主要内容,如果未能解决你的问题,请参考以下文章

如何在将对象作为泛型参数传递时使用它的基础类型

AttributeError:将 sql 函数作为默认参数传递时,“NoneType”对象没有属性“_jvm”

无法将对象作为参数传递

如何将向量作为参数传递给另一个向量?

定义一个函数以仅应用于作为参数传递的对象的属性子集[重复]

如何将对象(或关联数组)作为属性值传递给我的 Web 组件