JavaScript对象数组转字符串数组,有更简单的方法吗?

3

我非常习惯于使用C#的语法糖(而不像我想要的那样熟悉javascript),所以我发现这种写法非常冗长。

有没有更好的方法来实现同样的功能?

var justColumnNames = new Array();    
for( i= 0; i< columnsInfo.length; i++)
{
   justColumnNames[i] = columnsInfo[i].Name;
}

顺便说一下,我在页面上有Extjs可用,我不能真正使用任何其他库。谢谢。


我认为你有最好的方法。LINQ对JavaScript来说太酷了。 - zneak
道格,你的回答去哪了? - Roatin Marth
3个回答

5
Ext.each( columnsInfo, function(elem){
    justColumnNames.push(elem.name);
});

虽然这看起来更好,但实际上它与冗长的代码一样,并且使用闭包可能会增加一层复杂性。如果添加 justColumnNames 定义,它并没有变得更短。对于已经习惯于 Ext 和其 each 方法或类似框架的人来说,这可能更清晰,而且出错的可能性更小。 - Kamiel Wanrooij
因此,根据您的承认,它更清洁,外观更好,出错的可能性更小。我谦卑地建议它符合所要求的标准。尽管如此,您提出的观点很有道理。 - Upperstage
@Upper Stage - 你忽略了使用Ext的要求。另一个需要考虑的点是,你的版本几乎肯定比原版慢,尽管承认这并不总是一个问题。 - Tim Down
1
@Tim Down - 这个解决方案并没有忽略ExtJS,相反它利用了Ext.each()作为ExtJS提供的一个函数/工具。速度较慢?是的,但我理解请求是为了减少冗余。 - Upperstage
@Upper Stage:你没有理解我的观点,我的意思是你的回答需要ExtJS,而这仅仅为了使用一个简单的实用函数,这是一个非常繁重的要求。但是,我现在看到问题提到OP有ExtJS可用,所以我的观点无效了。 - Tim Down
@Tim Down:我明白了,你建议我在一个小问题上使用大锤(ExtJS)。如果 @Miau 没有可用的 ExtJS,我会同意你的观点。 - Upperstage

2
您需要的是一个名为map()的函数,它接受数组中的值,对每个值应用一个函数,并返回包含映射值的数组。我不太熟悉ExtJS是否默认包含映射函数,但这个问题提供了一些您可以使用的插件。
一旦您有一个可用的映射函数,您可以像这样进行操作:justColumnNames = columnsInfo.map(function(elem) { elem.Name });

-1

你可以轻松地在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 ...
}

但我通常不喜欢修改原生对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接