【问题标题】:Any equivalent of Java collections in Javascript?Javascript中的任何等效Java集合?
【发布时间】:2013-01-20 16:39:18
【问题描述】:

我必须在 Javascript 中将单词分解为字母集合。然后我需要能够 i) 检查一个字母是否属于该集合和 ii) 逐步删除该集合的字母。

例如,单词“cool”将被分解为“c”、“o”、“o”、“l”。如果我删除 'o'、'a' 和 'l',我应该只剩下 'c'、'o'。

在 Javascript 中实现此目的的正确数据结构是什么?

【问题讨论】:

  • 看看underscore.string库。
  • 您可以在数组和对象之间进行选择,两者各有优缺点。
  • 正确吗?恰当的?!它可以通过很多方式完成,这有什么好说的?您有两种基本类型,Object(有点像字典)和Array,您可以使用这两种类型构建更复杂的集合。

标签: javascript collections letter


【解决方案1】:

一个字符串!

var str = 'cool';

检查一个字符是否在字符串中:

if(str.indexOf('o') > -1) // the character is in the string

删除第一次出现的字符:

str = str.replace('o','');

如果您想修改字符串对象以提供这些操作的更多“逻辑”表示,您可以这样做:

String.prototype.contains = function(char){
    return this.indexOf(char) > -1;
};
String.prototype.remove = function(char){
    return this.replace(char,'');
};

你可以这样使用:

if ('cheese'.contains('che'))
   alert('Velviva!');

var str = 'hurt'.remove('r');   // 'hut'
    str = 'banana'.remove('n'); // 'baana'
    str = 'happy'.remove('c');  // 'happy'

【讨论】:

  • 我想知道为什么有人不使用为处理字符组而构建的对象...
  • @aepheus 对吧? OP 可能应该使用 jQuery,因为它很棒并且可以做任何事情。
  • 我想说我不知道​​为什么有人不使用字符串对象(即您在这里建议的方法)。并不是说他们应该使用一些库对象,甚至是一个数组。当您已经拥有具有相关功能的字符集合时,为什么还要浪费性能和空间。
  • 我是在讽刺。见here
  • @Shmiddty JQuery 的字符序列操作插件不是很健壮的 IMO,我建议 underscore.string
【解决方案2】:

一个数组!您可以通过简单地像这样拆分字符串来获得一个:

var arr = "word".split("");

您可以使用Array.prototype 中的方法像您所说的那样操作集合。例如,删除索引1处的字符:

arr.splice(1,1);

再次使其成为字符串:

arr.join('');

如果你只是想从一个字符串中读取一个特定的字符,你可以直接访问它的索引:

var str = "word";
str[1]; // "o"

您还可以使用其他字符串方法来获得与数组相同的结果(请参阅Shmiddty's answer)。

【讨论】:

  • 这并没有提到他将如何测试一个角色是否在“集合”中,他将如何从集合中删除一个角色,或者任何实际有用的东西......
  • 是的,但我可以扫描数组并将相应的条目设置为“”例如。我已经够幸福了!
  • @Shmiddty 我认为问题只是要求数据结构。我可以添加一些例子。我也喜欢你的回答,以及你如何解释我的第一句话:)。
  • 答案现在有了很大改善,+1!
【解决方案3】:

可以使用 JavaScript 的对象,例如:

var cool = "cool".split(""); // `cool` is an array of single-char strings
var crossIndex = {};
cool.forEach(function(entry) {
    crossIndex[entry] = true;
});

现在crossIndex 具有是否有给定字母的标志,所以:

var letter = "c"; // for instance

if (crossIndex[letter]) {
    // It has it

    // If you want to remove it:
    delete crossIndex[leter];
}
else {
    // It doesn't have it
}

【讨论】:

  • 这样做的好处是您可以使用语法if (letter in crossIndex)
猜你喜欢
  • 2012-06-05
  • 2015-08-28
  • 2010-10-19
  • 1970-01-01
  • 2010-11-29
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多