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语句改为Checka1.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;
}