Tìm chuỗi dài nhất trong mảng


84

Có cách nào ngắn gọn để tìm chuỗi dài nhất trong một mảng chuỗi không?

Một cái gì đó như thế arr.Max(x => x.Length);nào?

Câu trả lời:


194

Có sẵn kể từ Javascript 1.8 / ECMAScript 5 và có sẵn trong hầu hết các trình duyệt cũ hơn :

var longest = arr.reduce(
    function (a, b) {
        return a.length > b.length ? a : b;
    }
);

Nếu không, một giải pháp thay thế an toàn:

var longest = arr.sort(
    function (a, b) {
        return b.length - a.length;
    }
)[0];

Điều gì sẽ xảy ra nếu có 2 hoặc nhiều chuỗi có cùng kích thước và kết quả phải là một mảng? Giảm sẽ không hoạt động trong trường hợp đó và bạn phải lặp lại trên kết quả đầu tiên.
Gismo Ranas

@GismoRanas Đó là một câu hỏi khác và bạn vẫn có thể sử dụng reducevới hàm gọi lại trả về một mảng.
dối trá

34

Một câu trả lời mới cho một câu hỏi cũ: trong ES6, bạn có thể làm ngắn hơn:

Math.max(...(x.map(el => el.length)));

7
Điều này trả về độ dài của chuỗi dài nhất, không phải là chuỗi dài nhất.
Mikemike

Một điều khác cần lưu ý là điều này sẽ duyệt qua bộ sưu tập hai lần O(n^2)trong khi hầu hết các tùy chọn khác sẽ chỉ duyệt bộ sưu tập một lần O(n). Bộ so sánh tùy chỉnh có thể sử dụng sortthậm chí có thểO(log(n))
CTS_AE

27

Tôi sẽ làm một cái gì đó như thế này

var arr = [
  'first item',
  'second item is longer than the third one',
  'third longish item'
];

var lgth = 0;
var longest;

for (var i = 0; i < arr.length; i++) {
  if (arr[i].length > lgth) {
    var lgth = arr[i].length;
    longest = arr[i];
  }
}

console.log(longest);


2
Đây là cách tốt nhất vì nó không ảnh hưởng đến mảng của bạn. Trong khi nếu bạn sắp xếp (như trong câu trả lời đã chọn) mảng của bạn được sắp xếp, đôi khi bạn không muốn điều đó. +1, cảm ơn
thatOneGuy

4
var arr = [ 'fdgdfgdfg', 'gdfgf', 'gdfgdfhawsdgd', 'gdf', 'gdfhdfhjurvweadsd' ];
arr.sort(function (a, b) { return b.length - a.length })[0];

4

Sử dụng Array.prototype - (sắp xếp tương tự như những gì đã được đăng bởi @katsPaugh và @deceze khi tôi đang thực hiện trò chơi điện tử)

DEMO TẠI ĐÂY

var arr = [
    "2 --",
    "3 ---",
    "4 ----",
    "1 -",
    "5 -----"
];

Array.prototype.longest=function() {
    return this.sort(
      function(a,b) {  
        if (a.length > b.length) return -1;
        if (a.length < b.length) return 1;
          return 0
      }
    )[0];
}
alert(arr.longest());    

4

Tôi cung cấp cách tiếp cận hàm + đệ quy. Xem nhận xét để hiểu cách hoạt động:

const input1 = ['a', 'aa', 'aaa']
const input2 = ['asdf', 'qwer', 'zxcv']
const input3 = ['asdfasdf fdasdf a sd f', ' asdfsdf', 'asdfasdfds', 'asdfsdf', 'asdfsdaf']
const input4 = ['ddd', 'dddddddd', 'dddd', 'ddddd', 'ddd', 'dd', 'd', 'd', 'dddddddddddd']

// Outputs which words has the greater length
// greatestWord :: String -> String -> String
const greatestWord = x => y => 
      x.length > y.length ? x : y
      
// Recursively outputs the first longest word in a series
// longestRec :: String -> [String] -> String
const longestRec = longestWord => ([ nextWord, ...words ]) =>
      //                                ^^^^^^^^^^^^
      // Destructuring lets us get the next word, and remaining ones!
      nextWord // <-- If next word is undefined, then it won't recurse.
        ? longestRec (greatestWord (nextWord) (longestWord)) (words) 
        : longestWord


// Outputs the first longest word in a series
// longest :: [String] -> String
const longest = longestRec ('')

const output1 = longest (input1)
const output2 = longest (input2) 
const output3 = longest (input3)
const output4 = longest (input4)

console.log ('output1: ', output1)
console.log ('output2: ', output2)
console.log ('output3: ', output3)
console.log ('output4: ', output4)


bất kỳ ý tưởng tại sao điều này không làm việc cho tôi? const lengthRec = longWord => ([nextWord, ... words]) => ^ TypeError: undefined không phải là một hàm
công tước

@duke Tôi sẽ xem xét, nhưng tôi đoán điều gì đằng sau vấn đề.
Matías Fidemraizer

@duke BTW, bạn có thể cho tôi đầu vào được không? bạn đang sử dụng mã như hiện tại ?
Matías Fidemraizer

xem bên dưới. nhưng nó thậm chí không biên dịch dường như. nhưng bạn đúng: chỉ sử dụng mã của bạn mới hoạt động tốt .... let obj = {"HostName": {"Generated": "@logon", "Value": "openPI", "LastRun": "2018-11- 15 07: 57: 50,186 "}," HostIp ": {" Đã tạo ":" @cron "," Giá trị ":" 192.168.178.70 "," LastRun ":" 2018-11-15 02: 49: 23,961 "} , "Bản phát hành": {"Đã tạo": "@cron", "Giá trị": "Raspbian GNU / Linux 9 (căng)", "LastRun": "2018-11-15 02: 49: 24.099"}};
công tước

xin lỗi vì đã làm phiền bạn, tôi nghĩ nó không được biên dịch. Tôi không có một mảng.
công tước

3

Tôi thấy giải pháp ngắn nhất

function findLong(s){
  return Math.max.apply(null, s.split(' ').map(w => w.length));
}

1
Tôi thích cái đó hơn, mặc dù nó có thể không phải là cái nhanh nhất
guhur

1
điều này sẽ cho chiều dài nhưng không phải là chữ
brk

3

Có thể không phải là nhanh nhất, nhưng chắc chắn là khá dễ đọc:

function findLongestWord(array) {
  var longestWord = "";

  array.forEach(function(word) {
    if(word.length > longestWord.length) {
      longestWord = word;
    }
  });

  return longestWord;
}

var word = findLongestWord(["The","quick","brown", "fox", "jumped", "over", "the", "lazy", "dog"]);
console.log(word); // result is "jumped"

Hàm mảng forEach đã được hỗ trợ kể từ IE9 + .


3

Trong ES6 này có thể được thực hiện với một reduce()cuộc gọi trong O(n)phức tạp như trái ngược với các giải pháp sử dụng sort()đó là O(nlogn):

const getLongestText = (arr) => arr.reduce(
  (savedText, text) => (text.length > savedText.length ? text : savedText),
  '',
);

console.log(getLongestText(['word', 'even-longer-word', 'long-word']))


1
Tôi hy vọng sẽ có nhiều người kéo xuống phần này, bởi vì đây phải là câu trả lời được chấp nhận. Nếu vì lý do nào đó bạn cần cú pháp ES5 và không thể sử dụng chức năng mũi tên béo (mặt buồn), bạn có thể thực hiện việc này:arr.reduce(function(savedText, text) { return text.length > savedText.length ? text : savedText; }, '');
maxshuty

2

Tôi lấy cảm hứng từ chức năng của Jason và thực hiện một chút cải tiến cho nó và kết quả là công cụ tìm kiếm khá nhanh:

function timo_longest(a) {
  var c = 0, d = 0, l = 0, i = a.length;
  if (i) while (i--) {
    d = a[i].length;
    if (d > c) {
      l = i; c = d;
    }
  }
  return a[l];
}
arr=["First", "Second", "Third"];
var longest = timo_longest(arr);

Kết quả tốc độ: http://jsperf.com/longest-string-in-array/7


1

Tôi sẽ làm một cái gì đó như thế này:

function findLongestWord(str) {
var array = str.split(" ");
var maxLength=array[0].length;
for(var i=0; i < array.length; i++ ) {
if(array[i].length > maxLength) maxLength = array[i].length}
return maxLength;}

findLongestWord("What if we try a super-long word such as otorhinolaryngology");

1

Nếu chuỗi của bạn đã được chia thành một mảng, bạn sẽ không cần phần tách.

function findLongestWord(str) {
  str = str.split(' ');
  var longest = 0;

  for(var i = 0; i < str.length; i++) {
     if(str[i].length >= longest) {
       longest = str[i].length;
        } 
     }
  return longest;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

1

Trong trường hợp bạn mong đợi nhiều hơn một mức tối đa, điều này sẽ hoạt động:

_.maxBy(Object.entries(_.groupBy(x, y => y.length)), y => parseInt(y[0]))[1]

Nó sử dụng lodash và trả về một mảng.


0
var longest = (arr) => {
  let sum = 0
  arr.map((e) => {
    sum = e.length > sum ? e.length : sum
  })
  return sum
}

nó có thể là công việc


0
function findLongestWord(str) {
  str = str.split(" ");
  var sorted = str.sort(function(prev,current){
    return prev.length - current.length;   
  });
  var index = sorted.length;
  str = sorted[index-1];
  return str;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

Điều này có thêm bất cứ điều gì vào danh sách các câu trả lời hiện có đã mở rộng không? Không.
luk2302

0

Với ES6 cũng được hỗ trợ chuỗi trùng lặp

var allLongestStrings = arrayOfStrings => {
  let maxLng = Math.max(...arrayOfStrings.map( elem => elem.length))
  return arrayOfStrings.filter(elem => elem.length === maxLng)
}

let arrayOfStrings = ["aba", "aa", "ad", "vcd","aba"]

console.log(allLongestStrings(arrayOfStrings))

0

Các trình duyệt hiện đại hỗ trợ một for...ofvòng lặp. Cách nhanh nhất và ngắn nhất để giải quyết vấn đề này trong Chrome, Safari, Edge và Firefox cũng là cách rõ ràng nhất:

let largest = '';
for (let item of arr) {
  if (item.length > largest.length) largest = item
}

Trong IE, bạn có thể sử dụngArray.forEach ; điều đó vẫn nhanh hơn và rõ ràng hơn so với việc sắp xếp hoặc giảm bớt mảng.

var largest = '';
arr.forEach(function(item) {
  if (item.length > largest.length) largest = item
});

0

Đây là giải pháp đơn giản của tôi

var arr = ["you", "are", "the", "love", "of", "my", "life"];
var sorted = arr.sort(function (a, b){
     return b.length - a.length;
});

console.log(sorted[0])

0
function allLongestStrings(array) {
    const newArr=[];
    let temp =    Math.max(...(array.map(el => el.length)));    
     array.forEach(item => {
        if(temp == item.length){
          newArr.push(item);
        }
    });
    return newArr;
}

2
Mặc dù mã này có thể giải quyết vấn đề của OP, nhưng tốt nhất là bạn nên kèm theo lời giải thích về cách mã của bạn giải quyết vấn đề của OP. Bằng cách này, khách truy cập trong tương lai có thể học từ bài đăng của bạn và áp dụng nó vào mã của riêng họ. SO không phải là một dịch vụ mã hóa, mà là một nguồn kiến ​​thức. Ngoài ra, các câu trả lời chất lượng cao, đầy đủ có nhiều khả năng được ủng hộ hơn. Những tính năng này, cùng với yêu cầu rằng tất cả các bài đăng đều phải khép kín, là một số điểm mạnh của SO với tư cách là một nền tảng, giúp phân biệt nó với các diễn đàn. Bạn có thể chỉnh sửa để thêm thông tin bổ sung & / hoặc để bổ sung giải thích của bạn với tài liệu nguồn.
YSF

-1
var array = ["hello","falsey","undefined"];
var findLongestWord = function(array){
    var longest = array.reduce(function(a,b){
    return (a.length > b.length) ? a : b;
  });
    return longest;
}
findLongestWord(array);

hoặc cách gọn gàng hơn bằng cách sử dụng hàm Mũi tên: var findLongestWord = function (array) {var long = array.reduce ((a, b) => {return (a.length> b.length)? a: b;}); trở lại lâu nhất; }
Ash Khan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.