2016-05-14 14 views
6

Ho un numero array [2, 1, 3, 4, 5, 1] ​​e voglio rimuovere il numero più piccolo nell'elenco. Ma in qualche modo la mia dichiarazione IF viene saltata.Rimuovi il numero più piccolo in JS Array

ho controllato e di per sé "numeri [i + 1]" e "numeri [i]" fare il lavoro, ma "i numeri [i + 1] < numeri [i]" non lo fa ...

function removeSmallest(numbers) { 
 
    var smallestNumberKEY = 0; 
 
    for (i = 0; i <= numbers.lenths; i++) { 
 
    if (numbers[i + 1] < numbers[i]) { 
 
     smallestNumberKEY = i + 1; 
 
    } 
 
    } 
 
    numbers.splice(smallestNumberKEY, 1); 
 
    return numbers; 
 
} 
 

 
document.write(removeSmallest([2, 1, 3, 4, 5, 1]));

+1

'lenths'? Quando correggi questo errore, il tuo codice avrà 2 problemi con la lettura dei valori al di fuori del limite di un array: 1. L'elemento 'number.length' non esiste nell'array 2. L'elemento' number.length + 1' non esiste o. – zerkms

+0

Una volta corretta la lunghezza, cercherete anche oltre la fine dell'array. –

+0

wow un errore così studiato ... Grazie a tutti –

risposta

3

È possibile utilizzare Array#filter invece

function removeSmallest(arr) { 
 
    var min = Math.min.apply(null, arr); 
 
    return arr.filter((e) => {return e != min}); 
 
} 
 

 
console.log(removeSmallest([2, 1, 3, 4, 5, 1]))

+2

** AVVISO **: 'O (n^2)' – zerkms

+0

forse puoi trovare 'min' prima e poi filtrare in seguito? – gurvinder372

+0

se ci sono 2 (o più) valori minimi verrà filtrato più di una volta – maioman

4

Hai un errore di battitura nel codice, l'array non dispone lenths proprietà

function removeSmallest(numbers) { 
 
    var smallestNumberKEY = 0; 
 
    for (var i = 0; i < numbers.length - 1; i++) { 
 
    if (numbers[i + 1] < numbers[i]) { 
 
     smallestNumberKEY = i + 1; 
 
     numbers.splice(smallestNumberKEY, 1); 
 
    } 
 
    } 
 
    return numbers; 
 
} 
 

 
document.write(removeSmallest([2, 1, 3, 4, 5, 1]));

Ma il vostro algoritmo non funzionerà per un altro array, ad esempio [5, 3, 1, 4, 1], rimuoverà un valore 3 pure.

È possibile trovare il valore minimo con Math.min funzione e poi filtrare una serie

function removeSmallest(arr) { 
    var min = Math.min(...arr); 
    return arr.filter(e => e != min); 
} 
-1

un'altra soluzione con splice e indexOf:

array = [2, 1, 3, 4, 5, 1]; 
 

 
function replace(arr){ 
 
    arr = arr.slice(); //copy the array 
 
    arr.splice(arr.indexOf(Math.min.apply(null, arr)),1) 
 
    return arr; 
 
    } 
 

 
document.write(replace(array) ,'<br> original array : ', array)

edit: fare una copia della matrice eviterà che la matrice originale venga modificata

+0

se c'è un motivo per DV sarebbe costruttivo dare un feedback – maioman

+0

Stai rimuovendo solo uno degli 1. – Andy

+0

@Andy l'OP dice 'rimuovi il numero più piccolo' non' numeri'; il requisito dovrebbe essere quello di rimuovere 1 oggetto ... (e se leggi il suo codice che è quello che sta cercando di fare) – maioman

1

soluzione "Short" utilizzando Array.forEach e Array.splice metodi:

function removeSmallest(numbers) { 
    var min = Math.min.apply(null, numbers); 
    numbers.forEach((v, k, arr) => v !== min || arr.splice(k,1)); 
    return numbers; 
} 

console.log(removeSmallest([2, 1, 3, 4, 5, 1])); // [2, 3, 4, 5] 
1

Si tratta di una proposta con un singolo ciclo di Array#reduce e senzaMath.min.

L'algoritmo imposta nel primo ciclo min con il valore dell'elemento e restituisce una matrice vuota, poiché l'elemento effettivo è il valore più piccolo e il set di risultati non deve contenere il valore più piccolo.

Il ciclo successivo può avere

  • un valore minore min, quindi assegnare a a min e restituisce una copia dell'array originale fino all'elemento precedente, perché un nuovo minimo viene trovato e tutti gli altri elementi precedenti sono maggiori del valore attuale e appartengono alla matrice dei risultati.
  • un valore maggiore di min, quindi il valore effettivo viene inviato al set di risultati.
  • un valore pari a min, quindi il vaue viene saltato.

'use strict'; 
 

 
var removeSmallest = function() { 
 
    var min; 
 
    return function (r, a, i, aa) { 
 
     if (!i || a < min) { 
 
      min = a; 
 
      return aa.slice(0, i); 
 
     } 
 
     if (a > min) { 
 
      r.push(a); 
 
     } 
 
     return r; 
 
    } 
 
}(); 
 

 
document.write('<pre>' + JSON.stringify([2, 1, 3, 2, 4, 5, 1].reduce(removeSmallest, []), 0, 4) + '</pre>');

+1

'this.min' creerà la variabile globale' min' in modalità non rigida, che non è buona. Anche questo codice non funzionerà in modalità rigorosa, perché 'questo 'non sarà definito all'interno della funzione' removeSmallest'. –

+0

@YuriyYakym, grazie per aver segnalato questo problema. ora dovrebbe funzionare senza inquinare lo spazio globale. –

1

io preferirei fare questo lavoro come. L'operatore di spread è molto utile quando un oggetto Math incontra un oggetto Array.

var ar = [2, 1, 3, 4, 5, 1]; 
 
ar.reduce((p,c,i,a) => (p == c && a.splice(i,1),p) , Math.min(...ar)); 
 
document.write(JSON.stringify(ar));

0

Mi piace questo oneliner: list.filter(function(n) { return n != Math.min.apply(Math, list) })

verificarlo qui: https://jsfiddle.net/rz2n4rsd/1/

function remove_smallest(list) { 
    return list.filter(function(n) { return n != Math.min.apply(Math, list) }) 
} 

var list = [2, 1, 0, 4, 5, 1] 
console.log(list) // [2, 1, 0, 4, 5, 1] 

list = remove_smallest(list) 
console.log(list) // [2, 1, 4, 5, 1] 

list = remove_smallest(list) 
console.log(list) // [2, 4, 5] 
Problemi correlati