我正在创建一个基本算法来查找字符串中最长的单词。但是,我遇到了一个问题,即分配了不同变量的两个数组显示为相等。这是我的代码:
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
按照我原先的预期未分类。
显然第二个变量声明影响了第一个,但我不确定原因。我没有意识到导致这种行为的任何概念。
答案 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;
答案 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>');