数组中字符串长度的差异

时间:2016-10-26 12:12:33

标签: javascript arrays

我一直试图找到两个不同数组的字符串之间的最大长度差异。我在循环中放置一个循环来迭代并找到所有字符串长度的差异。

function mxdiflg(a1, a2) {
  if (a1 === [] || a2 === [])
    return -1;
  var result = 0;
  for (var i in a1) {
    for (var j in a2) {
      var diff = Math.abs(i.length - j.length);
      if (diff > result)
        result = diff;
    }
  }
  return result;
}

但是,此代码忽略了检查空数组的第一个if语句。它也返回0表示循环不起作用。

6 个答案:

答案 0 :(得分:1)

首先,您无法以这种方式比较数组。就像Renan所说的那样,数组是引用类型。更改您的检查以查看阵列中是否有任何内容。

if (!a1.length || !a2.length)
  return -1;

现在关于另一个问题。循环遍历for循环中的数组会将var设置为您所在的索引。

使用forEach

function mxdiflg(a1, a2) {
    ...
    var result = 0;
    a1.forEach(function(i){
       a2.forEach(function(j){
           var diff = Math.abs(i.length - j.length);
           if (diff > result)
               result = diff;
       });
   });
   return result;
}

// mxdiflg(['1','1'], ['111','1'])

或者,根据索引更改函数以从数组中获取项目:

function mxdiflg(a1, a2) {
    ...
    var result = 0;
    for (var idx in a1) {
        for (var jdx in a2) {
            var diff = Math.abs(a1[idx].length - a2[jdx].length);
            if (diff > result)
                result = diff;
        }
    }
    return result;
}

// mxdiflg(['1','1'], ['11','1'])

顺便说一句,如果你使用ES6,你可以这样做。我发现它更具可读性。

function mxdiflg(a1, a2) {
  if (!a1.length || !a2.length){
    return -1;
  }

  var a1Lengths = a1.map((str) => str.length);
  var a2Lengths = a2.map((str) => str.length);

  var a1MaxLength = Math.max(...a1Lengths);
  var a2MaxLength = Math.max(...a2Lengths);

  return a2MaxLength - a1MaxLength;
}

// mxdiflg(['1','1'], ['111','1']) = 2

答案 1 :(得分:0)

替换

if (a1 === [] || a2 === [])

if (!a1.length || !a2.length)

(因为否则你将yor数组与新的空数组进行比较,这些数组总是false) 和

for (var i in a1) {
  for (var j in a2) {
    ...
  }
}

for (var i of a1) {
  for (var j of a2) {
    ...
  }
}

(因为for ... in为您提供键/索引,而不是值,即[0,1,2,3,...]。

答案 2 :(得分:0)

因为数组a1永远不会等于[],所以即使[] == []也是假的,因为正在比较引用,而不是数字或字符串的值。查看Operators。检查一个数组的长度,以判断它们是否为空。

答案 3 :(得分:0)

var a1 = ['aaa','aa','a'],
    a2 = ['b','bbbbbbbb','b'];


 function mxdiflg(a1, a2) {
   if (!a1.length || !a2.length)
     return -1;
   var result = 0;
   for (var i=0; i<a1.length;i+=1) {
     for (var j=0;j<a2.length;j+=1) {
       var diff = Math.abs(a1[i].length - a2[j].length);
       if (diff > result)
         result = diff;
     }
   }
   return result;
 }

 mxdiflg(a1,a2);

不是最好的JS,而是你所写内容的工作副本

答案 4 :(得分:0)

按字符串长度对数组进行排序,然后针对彼此测试极值(开始和结束)。

&#13;
&#13;
//Initial data
var arr1 = ["Hello", "lol", "Testing"];
var arr2 = ["Houston", "Texas", "Bi-Polar Bear"];
//"Bi-Polar Bear" is longest and "lol" is shortest.

function findLongestStringDiff(arr1, arr2) {
  function findLongest(a, b) {
    return b.length - a.length;
  }
  arr1 = arr1.sort(findLongest);
  arr2 = arr2.sort(findLongest);
  return Math.max(
    arr1[0].length - arr2[arr2.length - 1].length,
    arr2[0].length - arr1[arr1.length - 1].length
  );
}
var diff = findLongestStringDiff(arr1, arr2);
console.log(diff);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

您的代码有很多问题,

1)你无法比较那样的数组,而是使用“typeof”来检查数组索引是否存在。

2)你正在使用的for-in循环是比较将相互抵消的数组索引的长度,你将得到0作为值,你应该使用normal for循环来进行这个过程  这个例子可能有帮助

numPixels:  .word   655536