格式化Javascript数据数组

Formatting an array of Javascript data

本文关键字:数组 数据 Javascript 格式化      更新时间:2023-09-26

这是一个web聊天的代码。我希望有这个代码检查每个单词,然后格式只有twitter @joeblow用户名作为twitter配置文件链接。

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

我正在学习如何使用apply或call,但不完全理解它们。就代码而言,它应该接受上下文数组,并对数组中的每个项应用format函数。

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

当我运行format.apply(undefined,context('@joeblow is my username'));时,它只返回[twitter]@joeblow。它应该打印类似[twitter]@joeblow [default]is [default]my [default]username的东西。在真实的场景中,@joeblow将是链接到@joeblow配置文件的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'));

您遇到的问题是,当您使用apply将分割字符串传递给format作为单独的参数时,在该函数中您实际上迭代这些参数。

.apply不会自动为你做这些——你必须要么使用显式循环,要么使用像.map这样隐式循环数组的函数。

.apply的主要用途是当你事先不知道你要传递多少个参数给一个需要单独参数而不是数组的函数时调用函数。

由于您的format函数实际上只接受一个参数并返回该参数的格式化版本,因此请尝试以下操作:

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