【问题标题】:How to compare strings in an array: Javascript如何比较数组中的字符串:Javascript
【发布时间】:2025-11-30 15:20:10
【问题描述】:

我有一个看起来像的数组

var arr = ["a|c", "a|e", "x|z"];
for(var x in arr){
    var appsplit = x.split("|");
}

如果元素中的第一个值(例如:a)匹配,那么它应该组合这些值

Ex: output ace xz

请告知如何实现这种方法。

【问题讨论】:

  • 你有什么问题?你试过什么吗?这是用javascript还是java?
  • java != javascript
  • @tnw OP 显然在 Question? 中尝试了 javascript
  • 想要的输出没有意义。
  • 他说对于数组中所有以相同字母开头的值,按顺序组合唯一的字母。 . .所以["a|b", "a|c", "a|d", "a|e"],结果将是“abcde”,因为这些值都以“a”作为它们的第一个值,并且它正在按顺序与所有第二个值组合。同样,["a|b", "a|c", "x|y", "x|z"] 会产生“abc”和“xyz”。

标签: javascript arrays arraylist


【解决方案1】:

你正在用这个谜语测试每个人的阅读理解能力。

var pairs = {};

var arr = ["a|c", "a|e", "x|z"];
for(var x in arr)
{
    var appsplit = arr[x].split("|");
    if(pairs[appsplit[0]] !== "undefined")
    {
        pairs[appsplit[0]] = pairs[appsplit[0]] + appsplit[1];
    }
    else
    {
        pairs[appsplit[0]] = appsplit[1];
    }

}

var matches = [];

for(var x in pairs)
{
    matches.push(x + pairs[x]);
}

console.log(matches);

我们需要在这个名为pairs 的对象中映射出arr 元素。拆分中的第一个值将是键,并附加第二个值(或分配 if 它是键的第一个匹配项)

您在拆分x时出错,但您只是拆分了元素的索引,而不是元素的实际值。 arr[x] 是实际值,其中x 指定数组中的索引。

检查完您的arr 后,我们现在可以将键与值合并。您的输出包含在 matches 中,其中每对中的键被附加到键对的值之前。

【讨论】:

  • 太棒了。稍作修改,这个解决方案就可以工作了。+100
  • 注意:这种方法的一个缺点(这也是我在解决方案中使用数组的原因)是对象结构不能保证其内容的任何顺序。所以当你这样做时@987654331 @,字符串可能会也可能不会按照它们创建的顺序出现。但是,如果顺序无关紧要,那么这将正常工作。
  • @talemyn 是的,严格来说,这是真的。但是this post 解释说大多数现代浏览器都遵循顺序。我自己经历过的唯一例外(在 Chrome 中)是当您有一个仅包含数字的 key 时。尝试在 Chrome 开发控制台中粘贴 {"first": 1, "1one": 2, "2": 3} 并观察它首先迭代 "2" 键。
  • @Vic - 是的,只是在最近的一个项目中,我才终于遇到了我的第一个对象键顺序问题。 . .不幸的是,它最终变成了一个大问题(验证规则的执行顺序)。我非常渴望开始深入研究Map,因为它似乎可以用Object 解决这个问题。
【解决方案2】:

一些简单的代码可以在这里解决问题。

var arr = ["a|c", "a|e", "x|z", "c|b", "z|e", "c|a"];
var resultObj = {};
arr.forEach(function(element, index){
     var array = element.split('|');
     if(array.length!==2){
        console.log("skipping, invalid input data", element);
     } else {
        var firstLetter = array[0];
        var secondLetter = array[1];
        if(resultObj[firstLetter]){
           resultObj[firstLetter].push(secondLetter);
        } else {
            resultObj[firstLetter]=[secondLetter];
        }
     }

});

Object.keys(resultObj).forEach(function(key){
    console.log(key + "," + resultObj[key]);
});

【讨论】:

    【解决方案3】:

    您可以使用.reduce()Set 不累积重复值,.some() 用于检查前一个数组是否包含当前数组中的值,.map()Array.from().join() 将数组转换为字符串

    var arr = ["a|c", "a|e", "x|z"];
    var res = arr.reduce(function(a, b) {
      var curr = b.split("|");
      var set = new Set;
      for (let prop of curr) set.add(prop);
      if (!a.length) {
        a.push(set)
      } else {
        for (prop of a) {
          if (curr.some(function(el) {
              return prop.has(el)
            })) {
            for (el of curr) {
              prop.add(el)
            }
          } else {
            for (let prop of curr) set.add(prop);
            a.push(set)
          }
        }
      }
      return a
    }, []).map(function(m) {
      return Array.from([...m], function(el) {
        return el
      }).join("")
    });
    
    console.log(res);

    【讨论】:

      【解决方案4】:

      我觉得这可以做得更优雅,但我没有时间简化它。 :) 下面的代码会做你想做的事:

      var aStartArray = **ARRAY_VALUE_HERE**;
      var aSplitResultStrings = [];
      
      // step through each element in the array
      for (var i = 0, iSALength = aStartArray.length; i < iSALength; i++) {
      
          // split the values for the current array element
          var aSplitVal = aStartArray[i].split("|");
          var bStringDoesNotExist = true;
      
          // loop through the "result strings" array
          for (var j = 0, iSRSLength = aSplitResultStrings.length; j < iSRSLength; j++) {
      
              // if the first letter from the array element = the first letter of the current "result string" . . .
              if (aSplitResultStrings[j].charAt(0) === aSplitVal[0]) {
      
                  // append the second letter of the array value to the current result string
                  aSplitResultStrings[j] = aSplitResultStrings[j] + aSplitVal[1];
      
                  // indicate that a match has been found and exit the "result string" loop
                  bStringDoesNotExist = false;
                  break;
              }
          }
      
          // if there are no result strings that start with the first letter of the array value . . .
          if (bStringDoesNotExist) {
      
              // concatenate the two values in the current array value and add them as a new "result string"
              aSplitResultStrings.push(aSplitVal[0] + aSplitVal[1]);
          }
      }
      

      使用这些数组,结果是:

      aStartArray = ["a|c", "a|e", "x|z"] //results in:
      aSplitResultStrings = ["ace", "xz"]
      
      aStartArray = ["a|b", "a|c", "a|d", "a|e", "x|y", "x|z"] //results in:
      aSplitResultStrings = ["abcde", "xyz"]
      
      aStartArray = ["a|b", "d|e", "d|f", "x|y", "g|h", "g|i", "m|n", "g|j", "a|c", "x|z"] //results in:
      aSplitResultStrings = ["abc", "def", "xyz", "ghij", "mn"]
      

      正如我所说,这可能更优雅(例如,您可以使用 Map 来更轻松地遍历“结果字符串”),但这使步骤非常清晰,应该让您正确通往最终解决方案的道路。

      【讨论】: