格式化Javascript数据数组

时间:2014-08-10 07:21:23

标签: javascript

此代码用于网络聊天。我希望让这段代码检查每个单词,然后只将twitter @joeblow用户名格式化为twitter个人资料链接。

简单地说,我正在解析聊天数据以将文本转换为twitter链接,主题标签,/ /命令,或者如果它不是这三个中的任何一个,则将其保留为文本。下面是我的调试代码。

我试图学习如何使用申请或电话,而不是完全理解它们。就代码而言,它应该采用上下文数组,并将格式函数应用于数组中的每个项目。

请注意这是我第一次尝试使用apply()而我不确定我做错了什么。

当我运行format.apply(undefined,context('@joeblow is my username'));时,它只返回[twitter]@joeblow。它应该打印像[twitter]@joeblow [default]is [default]my [default]username这样的东西。在现实世界中,@ joeblow将是链接到@joeblows配置文件的HTML(下面的伪代码只是为了简洁)。

我希望format()函数适用于传递的每个单词。 context()函数只接受传入的数据并将其转换为数组。我知道我可以写一个for循环,但我试图学习如何使用apply()/ call()。

function preformat(message) {
  format_message = {
    '#': 'hashtag',
    '/': 'command',
    '@': 'twitter'
  }
  var char = message.charAt(0);
  var type = format_message[char];
  if (type) {
    return type;
  } else {
    return 'default';
  }
}

function context(input) {
  var message = [];
  var words = input.split(' ');
  for (var i=0;i<words.length;i++) {
    message[i] = words[i];
  }
  return message;
}

function format(message) {
  var type = preformat(message);
  format.types = {
    'command': function(type, message) { return '[command]' + message; },
    'hashtag': function(type, message) { return '[hashtag]' + message; },
    'twitter': function(type, message) { return '[twitter]' + message; },
    'default': function(type, message) { return '[default]' + message; }
  }
  var parse = format.types[type];
  return parse(type,message);
}

我使用以下方式执行此操作:

format.apply(undefined,context('@joeblow is my username'));

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,当您使用apply将拆分字符串作为单独的参数传递给format时,在该函数中没有任何地方可以实际迭代这些参数。

.apply不会自动为您执行此操作 - 您必须使用显式循环,或者隐式循环数组的.map之类的函数。

.apply的主要用途是在您事先不知道要将多少参数传递给需要单独参数而不是数组的函数时调用函数。< / p>

由于你的format函数实际上只接受一个参数并返回该参数的格式化版本,所以试试这个,而不是:

context("@joeblow is my username").map(format).join(' ');