2016-11-02 2 views
1

Ich habe den folgenden JS-Code, der die ersten und letzten Elemente in einem Array zurückgeben und dann von den verbleibenden Elementen erhöht werden soll.Erhalten Sie gleich gepolsterte Schlüssel aus der Mitte des Arrays

So zum Beispiel:

var numbers = ['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten']; 
var values = []; 
values.push(numbers[0]); // get first 
values.push(numbers[numbers.length-1]); // get last 
numbers = numbers.slice(1, numbers.length-1); // remove the first and last from numbers 
console.log(numbers); // (numbers will go from 2-9 now) 
var interval = 2; 
for (var i = interval; i < numbers.length; i+=interval) { // get every 2nd item 
    values.push(numbers[i]); 
} 
console.log(values); 

Welche zurück:

["One", "Ten", "Four", "Six", "Eight"] 

So neu geordnet gibt mir:

["One", "Four", "Six", "Eight", "Ten"] 

Aber wenn die Datenmenge Änderungen Eleven haben das Ende Ergebnis wird sein:

neugeordneten gibt:

["One", "Four", "Six", "Eight", "Ten", "Eleven"] 

So ist das Problem hier ist, dass Ten und Eleven sind direkt nebeneinander und nicht als gleich voneinander wie die anderen Elemente.

Die einzige Möglichkeit, um dies zu vermeiden, war die Länge des Arrays zu überprüfen und zu sehen, ob es eine gerade Zahl ist oder nicht und dann das Intervall zu ungerade erhöhen, wenn dies der Fall ist. z.B.

if (interval % 2 != 0) 
    interval = interval + 1; 

Doch was ich finde, ist, dass manchmal kann man noch neben den letzten Punkt mit einem Punkt am Ende, die nicht das gleiche wie die andere in der Liste angeordnet ist, wenn die Mathematik klappt, denn nach dem tun slice, das zweitletzte Element im Array ist jetzt das letzte. Wenn also das Schleifenintervall perfekt mit diesem Index übereinstimmt, endet das mit diesem Element.

Wie kann ich dies vermeiden? Wähle grundsätzlich zuerst die ersten und letzten Gegenstände und packe dann die Gegenstände in der Mitte gleichmäßig auf ein vorgegebenes Intervall, das ich passieren kann.

Antwort

1

Sie könnten einfach den Index berechnen, um ein Array mit gleichem Abstand zu erhalten.

function getValues(array, count) { 
 
    var last = array.pop(), 
 
     values = []; 
 

 
    for (i = 0; i < count - 1; i++) { 
 
     values.push(array[Math.floor(i * array.length/(count - 1))]); 
 
    } 
 
    return values.concat(last); 
 
} 
 

 
console.log(getValues(['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten'], 5)); 
 
console.log(getValues(['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven'], 5));

Für eine wirklich gleiche Distanz Verteilung, können Sie einen Blick auf die euclidean algorithm haben oder eine bessere Nutzung bjorklunds algorithm, die Räume gleichmäßig um die Elemente einzufügen. Der populärere Titel ist euclideans rhythm.

+0

Das ist ziemlich glatt! Könnte erklären, was Sie in Ihrer Schleife tun, um den gleichen Abstand zu erhalten? Vielen Dank. – Cameron

+0

es ist nur das Array in gleichen Teilen zerkleinern. die Fußzeile verschiebt den Index mit einer Priorität nach unten. Daher können Sie das letzte Element zum Ergebnis hinzufügen, ohne danach sortieren zu müssen. –

-1

Sie müssen angeben, was Ihr Ziel ist. Es scheint, als ob Sie gleichmäßig beabstandete Werte einschließlich der ersten und letzten Elemente wünschen, aber Sie haben dies nicht formell angegeben und Sie haben nicht gesagt, ob aus irgendeinem Grund Intervalle von 2 bevorzugt werden.

Verwandte Themen