我有以下功能:
String.prototype.format = function() {
var args = arguments;
return this.replace(/{(\d+)}/g, function(match, number) {
return typeof args[number] != 'undefined' ? args[number] : match;
});
};
现在说我已经定义了以下代码:
var dataItem = { membershipId: 1, userId: 3 };
var dataKeyNames = 'membershipId,userId';
var url = '/Admin/User?MembershipId={0}&UserId={1}';
我想做的是调用格式函数传递数据项中的每个值(对于每个数据键名称)。例如,如果只有一个数据键名称,那么我可以说:
var formattedUrl = url.format(dataItem[dataKeyNames]);
但我需要能够对dataKeyNames进行拆分,并将格式函数中作为参数的数据项中的每个对应值传递。
如果有人能告诉我这是怎么做的,我会很感激。感谢
答案 0 :(得分:2)
让我们一步一步。
首先,您可以使用dataKeyNames.split(",")
将键字符串拆分为数组。
然后,您可以在字符串数组上调用map
以生成新数组 - 具体来说,您要传递给format
方法的值。您可以在此处与dataItem
变量进行互动。
最后,您可以使用url.format.apply
使用新数组实际调用您的format
方法。请注意,将url
作为apply
的第一个参数传递可能是最重要的 - 它设置this
将使用的format
值。
这是我提出的代码:
var formattedUrl = url.format.apply(url, dataKeyNames.split(",").map(function (val, index, array) {
return dataItem[val];
}));
DEMO: http://jsfiddle.net/T4tHx/
为了使其更具可读性,您绝对可以将其分成几行。
<强>参考文献:强>
String.prototype.split
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split Array.prototype.map
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map Array.prototype.map
浏览器支持 - http://kangax.github.io/es5-compat-table/#Array.prototype.map Function.prototype.apply
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply