我不确定这个标题是否适合我正在努力实现的目标
我将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;
});
});
发布于 2012-12-07 17:33:06
将[]
与字符串一起使用可以动态地从对象中提取属性。
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');
});
发布于 2012-12-07 17:41:28
这可以使用[]
运算符来完成,而不是像in this fiddle ive created just for you :D一样使用.
-notation
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');
发布于 2012-12-07 17:33:52
您需要传递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"});
});
https://stackoverflow.com/questions/13760186
复制相似问题