我非常习惯于使用C#的语法糖(而不像我想要的那样熟悉javascript),所以我发现这种写法非常冗长。
有没有更好的方法来实现同样的功能?
var justColumnNames = new Array();
for( i= 0; i< columnsInfo.length; i++)
{
justColumnNames[i] = columnsInfo[i].Name;
}
顺便说一下,我在页面上有Extjs可用,我不能真正使用任何其他库。谢谢。
我非常习惯于使用C#的语法糖(而不像我想要的那样熟悉javascript),所以我发现这种写法非常冗长。
有没有更好的方法来实现同样的功能?
var justColumnNames = new Array();
for( i= 0; i< columnsInfo.length; i++)
{
justColumnNames[i] = columnsInfo[i].Name;
}
顺便说一下,我在页面上有Extjs可用,我不能真正使用任何其他库。谢谢。
Ext.each( columnsInfo, function(elem){
justColumnNames.push(elem.name);
});
justColumnNames
定义,它并没有变得更短。对于已经习惯于 Ext 和其 each
方法或类似框架的人来说,这可能更清晰,而且出错的可能性更小。 - Kamiel Wanrooijmap()
的函数,它接受数组中的值,对每个值应用一个函数,并返回包含映射值的数组。我不太熟悉ExtJS是否默认包含映射函数,但这个问题提供了一些您可以使用的插件。justColumnNames = columnsInfo.map(function(elem) { elem.Name });
你可以轻松地在JavaScript中添加语法糖。其中一个常见的语法糖是为数组实现foreach/map/filter方法。大多数库都会这样做。我的实现:
// List object, inherits from Array
function List (array) {
// Allow List constructor to convert
// Array object into List object:
if (array !== undefined) {
this.push.apply(this,array)
}
// each() method. A cross between map and filter:
this.each = function (callback) {
var ret = new List();
for (i=0,l=this.length;i<l;i++) {
var r = callback(this[i],i);
if (r !== undefined) {
ret.push(r);
}
}
return ret;
}
}
List.prototype = new Array();
// Direct translation of your code:
var justColumnNames = new List();
justColumnNames.each(function(n,i){
n = columnsInfo[i].Name;
});
// Or the more brief:
var justColumnNames = new List(columnsInfo).each(function(n){return n.Name});
有些人直接修改数组构造函数,做法如下:
Array.prototype.each = function (callback) {
// see implementation above ...
}
但我通常不喜欢修改原生对象。