如何比较数组中的字符串:Javascript

时间:2017-04-18 19:32:33

标签: javascript arrays arraylist

我有一个看起来像

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

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

  

Ex: output ace xz

请建议如何采用这种方法。

4 个答案:

答案 0 :(得分: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);

我们需要在此对象中映射出名为arr的{​​{1}}元素。分割中的第一个值是关键值,第二个值是附加的(或者分配pairs它是第一个匹配的关键值)

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

在我们完成x后,我们现在可以将密钥与值合并。您的输出包含在arr中,其中每对中的键前置于键对的值。

答案 1 :(得分:1)

这里有一些简单的代码。

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]);
});

答案 2 :(得分:1)

您可以使用.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);

答案 3 :(得分:1)

我觉得这可以更优雅地完成,但我没有时间精简它。 :)以下代码将执行您想要的操作:

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来更轻松地遍历“结果字符串”),但这会使步骤非常清晰并且会让您失望通往最终解决方案的正确道路。