2014-07-10 4 views
0

ИЗМЕНИТЬ, ЧТО Я ИЗМЕНИЛ ВОПРОС, ЧТО Я СКАЗАЛ. Целью является использование функции Math.max для определения самого длинного массива. Мне нужно было добавить дополнительный параметр, чтобы сделать его практичным, потому что все использовали> вместо Math.max. Я писал этот пример быстро и не думал об этом.Определите, какой массив длиннее. JavaScript

Есть ли более простой способ сделать это? Цель состоит в том, чтобы иметь возможность принимать множество аргументов (более двух) и выяснить, какая из них имеет большую длину. Я бы хотел, чтобы он был динамическим, поэтому кажется, что мне нужно дать свойство имени каждому массиву, прежде чем передавать их. Это единственный способ правильно найти имя массива?

var arrayLogA = [8, 7, 5, 4, 6, 8, 0, 9, 4]; 
arrayLogA.name = 'arrayLogA'; 

var arrayLogB = [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2] 
arrayLogB.name = 'arrayLogB'; 

var arrayLogC = [1, 6, 9, 3, 3, 7, 3, 2] 
arrayLogC.name = 'arrayLogC'; 

function returnLargestArray(a, b, C) { 

    ... 
} 

returnLargestArray(arrayLogA, arrayLogB); 

нормально, это более практично, если я собираюсь объяснить функцию Math.max, а также вернуть самый большой, я собираюсь придется пересмотреть эту функцию. Извините за любую путаницу. Я обычно пишу хорошие вопросы, но я думаю, что я бросил это. Очень жаль.

Возможно, мне потребуется передать дополнительные параметры. SO, возможно, я не должен был использовать a, b, c в качестве аргументов.

+0

Добавление свойства '.name' на самом деле не является допустимым синтаксисом массива. JavaScript либо заказал массивы, либо объекты со свойствами - не ассоциативные массивы. – tymeJV

+0

Используйте' === 'вместо' == '. –

+3

@tymeJV это совершенно верно. В JavaScript-массивах объекты _are_. – Oleg

ответ

1

Хорошо, это может быть немного меньше, чем идеально, и, конечно, немного странно, но вы можете сделать что-то подобное.

var arrayLogA = [8, 7, 5, 4, 6, 8, 0, 9, 4]; 
arrayLogA.name = 'arrayLogA'; 

var arrayLogB = [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2]; 
arrayLogB.name = 'arrayLogB'; 

var arrayLogC = [1, 6, 9, 3, 3, 7, 3, 2]; 
arrayLogC.name = 'arrayLogC'; 
... 

var arrayLogN = [ ... ]; 
arrayLogN.name = 'arrayLogN'; 

function returnLargestArray(/* some unknown number of arrays */) { 
    var lengths = []; 

    // store lengths of each array 
    for(var i = 0; i < arguments.length; i++){ 
    lengths.push(arguments[i].length); 
    } 

    // use Math.max to get biggest length 
    var largest = Math.max.apply(null, lengths); 

    // use indexOf to get the index of biggest length 
    var indexOfLargest = lengths.indexOf(largest); 

    // use the indexOfLargest to return that value from arguments 
    return arguments[indexOfLargest].name; 
} 

returnLargestArray(arrayLogA, arrayLogB, arrayLogC, ..., arrayLogN); 

Используя этот метод вернет вам lengthiest массив передается в функцию, не требуя от вас имя каждого массива.

Простое примечание: эта функция вызывает Math.max.apply, а не только Math.max, потому что Math.max ожидает несколько входов, а не только один массив, который мы пытаемся найти максимум внутри. Чтобы Math.max работал над массивом, мы должны использовать Math.max.apply.

Надеюсь, это делает то, что вы хотите!

Редактировать: добавлены свойства имен для массивов, чтобы вернуть имя в конце функции.

+0

Я играю с этим. –

+0

Попытка заставить его вернуть имя массива ... –

+0

В этом случае, если ваши массивы уже являются именами, в конце вы можете вернуть аргументы [indexOfLargest] .name. – Mercury

1

Попробуйте это. (Я не проверял еще, но это имеет смысл!)

function returnLargestArray(a, b) { 

    if (a.length > b.length) { 
     return console.log("winner: "+ a.name); 
    } else { 
     return console.log("winner: "+ b.name); 
    } 
} 

Если они ту же длину, что не получится, но вы получите идею.

+0

Почему вы возвращаете console.log? ?? – Oleg

+0

Я только что использовал этот код из вопроса. Я предполагаю, что это то, что он хочет (по какой-то причине). Возвращение a.name или b.name кажется мне более простым. – BrettFromLA

+0

@BrettFromLA OP, безусловно, не хочет этого, потому что это не имеет никакого смысла. – Oleg

1

А что-то вроде:

if (a.length > b.length) { 
    console.log("winner: "+ a.name); 
    return a; 
else { 
    console.log("winner: "+ b.name); 
    return b; 
} 

или если вы хотите, чтобы это было действительно коротким:

return a.length > b.length ? a : b; 

Как примечание стороны, ваша логика может использовать небольшую работу. Прямо сейчас он возвращает результат от console.log, который составляет undefined. Возвращение массива имеет больше смысла и имеет больше смысла от имени вашей функции.

2
function returnLargestArray(a,b){ 
    if(!a || typeof a.length =="undefined" || 
    !b || typeof b.length =="undefined") {return;} 
    if(a.length==b.length){/*return some value of your choosing*/} 
    return a.length>b.length?a:b; 
} 
returnLargestArray([1,2,3],[1,2,3,4]); 

Но будьте осторожны с предостережениями для «простых» массивов.

  • Non-массив объектов со свойством длины
  • Массивы, которые имели индексы явно, будут подсчитаны на основе их максимального индекса, а не количество «используемых» индексов
+0

'typeof' - это оператор, а не функция. – Oleg

+0

Кроме того, я бы сказал, что вполне безопасно делать только «a.length === undefined». – Oleg

+0

В этом случае да, но если читатель ответа не понимает, почему он безопасен, его можно было бы неправильно использовать в другом месте –

1
function returnLargestArray(a, b) { 
    return 'winner is ' + (a.length == b.length ? 'nobody' : (a.length > b.length ? a : b).name); 
} 
1

В коде можно использовать другую структуру. Похоже, вам нужны объекты с двумя свойствами: имя и массив данных.

var logA = { 
    name: "logA", 
    array: [8, 7, 5, 4, 6, 8, 0, 9, 4] 
}; 

var logB = { 
    name: "logB", 
    array: [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2] 
}; 

Затем определит функцию, работающим на таких объектах:

function largestLog(a, b) { 
    if (a.array.length > b.array.length) { 
     return a; 
    } 
    else { 
     return b; 
    } 
} 

И тогда вы можете вызвать функцию, получить объект с самым большим массивом, и напечатать его имя консоль:

var l = largestLog(logA, logB); 
console.log(l.name); 
1

В нормальных условиях вы, вероятно, проверите длину массивов, а затем вернете тот, который удовлетворяет логике (большей или меньшей), а затем будет работать с этим объектом.

Переназначение a и b для arrayA и arrayB, по-видимому, не имеет заслуг, другое - дать семантический ответ. Вы можете также использовать эти назначения var как строки, поскольку это будет иметь больше смысла в контексте, который вы демонстрируете.

var arrayLogA = [8, 7, 5, 4, 6, 8, 0, 9, 4]; 
var arrayLogB = [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2] 
function returnLargestArray(a, b) { 
    var a = a.length, 
     b = b.length, 
     winner = 'arrayA'; 
    if(a < b && a !== b) { 
     winner = 'arrayB'; 
    } else { 
     winner = 'none'; 
    } 
    return winner; 
} 
returnLargestArray(arrayLogA, arrayLogB); 

Math.max(), вероятно, избыток требований, я бы не представить себе, что имеет какие-либо преимущества скорости по сравнению с обычными операторами [=!<>] видящих, как вы в результате чего еще один объект для воспроизведения Math и доступа к функции этого объекта.

Способ, которым меня учили (в этом бинарном сценарии [true, false] [a или b] и т. Д.) - установить возвращаемое значение в верхней части функции. Таким образом, каждый, кто читает, может легко увидеть, что такое назначение функций, а затем используйте свою логику для переключения этого состояния.

Итак, если победитель = a; вы тестируете b больше, чем a, если это так, установите winner = b. Сохраняет много кода и должен быть более эффективным.

+0

Это было ближе всего к тому, что я пытался сделать, мой вопрос вышел из-под контроля, и я думаю об удалении потому что я смутил всех. Очень жаль. Любая возможность взглянуть на перефразированный вопрос. –

Смежные вопросы