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

时间:2012-12-07 09:24:24

标签: javascript function object properties parameters

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

我将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;
    });
});

5 个答案:

答案 0 :(得分:36)

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

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');
});

答案 1 :(得分:1)

这可以使用[]运算符代替. - 符号来完成,就像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');

答案 2 :(得分:0)

您需要将item对象和item-key映射传递给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"});
});

答案 3 :(得分:0)

这样的东西
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;
}

可以帮忙吗?

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

答案 4 :(得分:-1)

试试这个:

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;
    });
});