如何在JavaScript中将我的数组作为* nice *人类可读列表?

时间:2010-09-22 00:44:46

标签: javascript

我有一个允许的文件扩展名列表,可以上传到我的网站。

我用jQuery Validation plugin检查它们。

如果他们选择不受支持的扩展名,我会显示错误消息。

看起来像是

var msg = 'You may only upload files of type ' + allowedExt.join(', ');

显然这个列表看起来不太闪光。我希望它看起来更像人类可读

有什么办法吗?

6 个答案:

答案 0 :(得分:10)

执行answer posted by alex的更简单方法是使用.pop()关闭最后一个元素:

var niceList = function(array, join, finalJoin) {
    var arr = array.slice(0), last = arr.pop();
    join = join || ', ';
    finalJoin = finalJoin || ' and ';
    return arr.join(join) + finalJoin + last;    
};

答案 1 :(得分:5)

接受的答案不能很好地处理一个项目列表。

function niceList(array) {
  if (!array || array.length == 0) return "";
  var clone = array.slice(0);

  return function build() {
    if (clone.length == 1) return clone[0];
    if (clone.length == 2) return clone[0] + ' and ' + clone[1];
    return clone.shift() + ", " + build();
  }();  
}

答案 2 :(得分:4)

另一种方法。

考虑的案例:

  • [] - > “”
  • [“”] - > “”
  • [“A”] - > “A”
  • [“A”,“B”] - > “A和B”
  • [“A”,“B”,“C”] - > “A,B和C”

......等等

function niceList(a) {
    return [
            a

            /* Get all the elements except the last one.
             * If there is just one element, get that
             */
            .slice(0, a.length - 1 || 1)

            /* Create a comma separated string from these elements */
            .join(", ")
        ]
        /* Process the last element (if there is one) and concat it
         * with the processed first part.
         */
        .concat(
            a

            /* Create a copy */
            .slice()

            /* Take the last element, if there is one */
            .splice(-1, Number(a.length > 1))
        )

        /* Join the two processed parts */
        .join(" and ");
}

答案 3 :(得分:2)

是的,你可以!

var niceList = function(array, join, finalJoin) {       
    join = join || ', ';
    finalJoin = finalJoin || ' and ';       
    var length = array.length;      
    return array.slice(0, length - 1).join(join) + finalJoin + array[length - 1];    
};

alert(niceList([a, b, c])); // 'a, b and c'

答案 4 :(得分:2)

因为我们显然提供了不同版本的alex答案,所以这里没有join

function niceList(array, join, final) {
   return array.reduce(function (pv, cv, i, a) { 
      return pv + (i == a.length - 1 ? final : join) + cv; 
   });
}; 

不适用于旧浏览器等。

答案 5 :(得分:0)

我从字面上把你带到了一个实际的HTML列表中。

var extensions = ['html', 'txt', 'png', 'jpg'];
var extension_list = '<ul>';

for(i=0; i<extensions.length; i++)
{
    extension_list += '<li>'+extensions[i]+'</li>';
}

extension_list += '<ul>';

var msg = '<p>Sorry, you can only upload the following extensions:</p>'+extension_list;