Javascript 数组中字符串长度的差异

Javascript 数组中字符串长度的差异,javascript,arrays,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);

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

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,表示循环不工作。

Replace

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

(否则,您将把您的数组与新的空数组进行比较,空数组总是
false
) 及


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

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

首先,不能用这种方式比较数组。如上所述,数组是引用类型。更改检查以查看阵列中是否有任何内容

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
var a1=['aaa','aa','a'],
a2=['b','BBBBBB','b'];
函数mxdiflg(a1,a2){
如果(!a1.长度| |!a2.长度)
返回-1;
var结果=0;

对于(var i=0;i按字符串长度对数组排序,然后相互测试极值(开始和结束)

//初始数据
var arr1=[“Hello”、“lol”、“Testing”];
var arr2=[“休斯顿”、“德克萨斯”、“双极熊”];
//“双北极熊”最长,“lol”最短。
函数findLongestStringDiff(arr1、arr2){
函数findLongest(a,b){
返回b.length-a.length;
}
arr1=arr1.sort(findLongest);
arr2=arr2.sort(findLongest);
返回Math.max(
arr1[0]。长度-arr2[arr2.length-1]。长度,
arr2[0]。长度-arr1[arr1.length-1]。长度
);
}
var diff=findLongestStringDiff(arr1,arr2);

console.log(diff);
您的代码有很多地方出错

1) 您不能像那样比较数组,而是使用“typeof”,它将检查数组索引是否存在

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

 function mxdiflg(){

  var a1 =['asd','asdasd','asddfgsd'];
  var a2 = ['werw','werrewerewr','werwreewrererwer'];


 if ((typeof a1[0] !== 'undefined')&& (typeof a2[0] !== 'undefined')){

    var result = 0;
     for (var i=0;i<a1.length;i++) {
       for (var j=0;j<a2.length;j++) {
          var diff = Math.abs(a1[i].length - a2[j].length);

          if (diff > result)
               result = diff;
            }
          }
        }
      return result;

   }
函数mxdiflg(){
变量a1=['asd'、'asdasd'、'asddfgsd'];
变量a2=['werw','werrewerewr','WERREWEREWER'];
如果((类型a1[0]!='undefined')&(类型a2[0]!='undefined')){
var结果=0;

对于(var i=0;iThus您想从数组中获取最长和最短的字符串吗?不要将数组与空数组进行比较。这永远不会起作用,因为数组类型是引用类型。请检查每个数组的长度是否不是零。谢谢,我将第一个if语句改为Check
a1.length==0 | a2.length==0
在这种情况下,除了使用length属性外,还有另一种检查空数组的方法吗?@James我想你可以测试
a1.hasOwnProperty(0)
,看看数组是否定义了
0
属性(即第一个数组索引),但这会使您不太清楚您在做什么。此外,如果您
删除属性,则会导致不同的结果(这会消除该属性,但不会影响
长度
),但是如果你
删除
数组索引,那么你几乎肯定是做错了什么。如果我不够清楚,很抱歉。我想要两个数组中字符串长度的最大差异。而不是两个数组中字符串长度的最大差异。实际上,我已经编写了另一个版本,可以找到最大差异长度的差异,无论它是否在同一字符串中。
函数mxdiflg(a1,a2){if(!a1.length | | | |!a2.length)返回-1;var newArr=[];newArr=newArr.concat(a1,a2).map((s)=>s.length);返回Math.abs(Math.max(…newArr)-Math.min(…newArr))}
我至少能做到这一点。啊,好吧。是的,只要把
Math.max
中的一个换成ES6版本中的
Math.min
。如果需要的话,我可以相应地调整ES5版本。听起来你走的路是对的。
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'])
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
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);
 function mxdiflg(){

  var a1 =['asd','asdasd','asddfgsd'];
  var a2 = ['werw','werrewerewr','werwreewrererwer'];


 if ((typeof a1[0] !== 'undefined')&& (typeof a2[0] !== 'undefined')){

    var result = 0;
     for (var i=0;i<a1.length;i++) {
       for (var j=0;j<a2.length;j++) {
          var diff = Math.abs(a1[i].length - a2[j].length);

          if (diff > result)
               result = diff;
            }
          }
        }
      return result;

   }