Javascript变量相互影响

时间:2016-02-01 17:49:21

标签: javascript arrays sorting

我正在创建一个基本算法来查找字符串中最长的单词。但是,我遇到了一个问题,即分配了不同变量的两个数组显示为相等。这是我的代码:



function LongestWord(sen) {
  var arr = sen.split(' '); // arr = ['How', 'is', 'your', 'dinner']
  var wordsLength = arr.map(function(word) { // wordsLength = [3, 2, 4, 6]
    return word.length;
  });
  var sortLength = wordsLength.sort(function(a, b) { //sortLength = [6, 4, 3, 2]
    return b - a;
  });

  console.log(wordsLength === sortLength);

}
LongestWord("How is your dinner");




我评论了我期望每个数组在代码中相等。然而,在wordsLength var被声明之前,某种方式sortLength被排序。我知道这一点,因为控制台会记录"TRUE"。我认为地图可能会以某种方式自动对变量进行排序,但当我注释掉sortLength时,wordsLength按照我原先的预期未分类。 显然第二个变量声明影响了第一个,但我不确定原因。我没有意识到导致这种行为的任何概念。

3 个答案:

答案 0 :(得分:1)

array.sort()对数组进行排序返回它。 因此,您对arrLength进行了排序并将其分配给sortLength,现在它们是相等的。

答案 1 :(得分:1)

来自MDN sort是一个对数组元素进行排序的函数,因此在排序之前需要对数组进行浅层复制,使用函数slice

您的代码现在加上一个新函数来获取最长的单词:



function LongestWord(sen) {
  var arr = sen.split(' '); // arr = ['How', 'is', 'your', 'dinner']
  var wordsLength = arr.map(function(word) { // wordsLength = [3, 2, 4, 6]
    return word.length;
  });
  var sortLength = wordsLength.slice().sort(function(a, b) { //sortLength = [6, 4, 3, 2]
    return b - a;
  });

  document.body.innerHTML += '<p>' + (wordsLength === sortLength) + '</p>';

}

function NewLongestWord(sen) {
  if (sen.trim().length == 0) {
    return -1;
  }
  var arr = sen.split(' ').sort(function(a, b) { //sortLength = [6, 4, 3, 2]
    return b.length - a.length;
  });
  return arr[0];
}


document.body.innerHTML += '<p>' + (NewLongestWord("How is your dinner")) + '</p>';

LongestWord("How is your dinner");
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我建议使用sorting with map,因为数组可以使用临时数组按长度排序。

更好的解决方案是不对数组进行排序。而不是排序使用像Array#reduce这样的迭代器,因为只需要一次迭代而不是更像排序。

function longestWord(sen) {
    // the array to be sorted
    var list = sen.split(' '); // arr = ['How', 'is', 'your', 'dinner']
    
    // temporary array holds objects with position and sort-value
    var mapped = list.map(function (el, i) {
        return { index: i, value: el.length };
    });

    // sorting the mapped array containing the reduced values
    mapped.sort(function (a, b) {
        return b.value-a.value;
    });

    // container for the resulting order
    var result = mapped.map(function (el) {
        return list[el.index];
    });
    return result.shift();
}

function longestWord2(s) {
    return s.split(' ').reduce(function (a, b) {
        return a.length > b.length ? a : b;
    });
}

document.write(longestWord('How is your dinner') + '<br>');
document.write(longestWord2('How is your dinner') + '<br>');