2016-09-04 2 views
1

Ich habe eine Zeichenfolge, die wie folgt aussieht (dies ist ein Wert, den ich von einem Eingang in der Seite HTML erhalten):Convert String Array - jQuery.inArray() nicht funktioniert

'[123,234,345]' 

ich diesen Wert drehen in ein Array in meinem JS:

var tempProjectTasks = $('#task_id_array').val(); 
tempProjectTasks = tempProjectTasks.replace('[', '').replace(']',''); 
selectedProjectTasks = tempProjectTasks.split(','); 

ich dieses Array in einer Schleife dann vergleichen

$.each(tasks, function(key, value) { 
    if ($.inArray(value['id'], selectedProjectTasks) != -1) { 
     checked = 'checked'; 
    } else { 
     checked = ''; 
    } 
    ... more stuff here ... 
}); 

Dies ist eine Liste für die HTML ein Gebäude Jede Zeile enthält ein Kontrollkästchen.

Ich kann in der Konsole den Vergleich für diese Werte -1 durch Hinzufügen der console.log Befehle unten in der Schleife sehen.

console.log(selectedProjectTasks); 
console.log(value['id']); 
console.log($.inArray(value['id'], selectedProjectTasks)); 

in der Konsole:

["123","234","345"] 
123 
-1 

Warum ist die inArray() nicht die passenden Werte zu finden? Was habe ich verpasst? Danke

+0

Was ist 'Wert [ 'id']'? Ist es eine schlecht geformte Anordnung oder ein Objekt? – zer00ne

+0

vielleicht sollten Sie versuchen, parseInt() auf Wert ['ID'] – thephpx

Antwort

2

["123","234","345"] ist ein Array von String, wobei 123 eine ganze Zahl ist.

Sie können dies auf Zeichenfolge konvertieren toString verwenden, bevor es in Array suchen

console.log($.inArray((value['id'].toString(), selectedProjectTasks)); 
+0

Ich mag Ihre Lösung besser als meine Suche. Danke – TheRealPapa

1

Ich war String Elemente auf ganze Zahlen zu vergleichen, so inArray() versagt wurde.

Ich habe gerade die folgende Zeile hinzugefügt und voila!

var tempProjectTasks = $('#task_id_array').val(); 
tempProjectTasks = tempProjectTasks.replace('[', '').replace(']',''); 
selectedProjectTasks = tempProjectTasks.split(','); 
for(var i = 0; i < selectedProjectTasks.length; i++) selectedProjectTasks[i] = +selectedProjectTasks[i]; 

Hoffe, das hilft jemand anderem. Vielen Dank.

+0

Sie sollten erklären, warum/wie das, was Sie tun, funktioniert und warum es benötigt wurde. – Makyen

2

Ich glaube, die Antwort liegt in dem $ .inArray() docs, wo es heißt

Der Vergleich zwischen den Werten streng. Im Folgenden wird -1 zurück (nicht gefunden), da eine Anzahl in einem Array von Strings

Sie sollten entweder Ihre neue Array Zahlen oder Ihren Vergleichswert in einen String umwandeln gesucht. Dann sollte es funktionieren.

0

Sie können wie diese

var arrStr = str.replace(']','').replace('[','').split(",") 
arrStr = arrStr.map(Number); 
$.inArray(123,arrStr); 

tun Sie es mit JavaSscript#indexOf ohne jQuery Funktion tun können.

var arrStr = str.replace(']','').replace('[','').split(",") 
arrStr = arrStr.map(Number); 
arrStr.indexOf(value['id']); 
// return -1 id no find otherwise return index of the element. 
0

Das Problem ist, dass der Vergleich, dass inArray() tut strict ist. Sie können stattdessen $.grep() verwenden.

RegularExpression spezifischer Ansatz.

var strArray = '[123,234,345]'; 
 
var selectedProjectTasks = (/^\[(.*)\]$/g.exec(strArray)[1]).split(",") 
 

 
console.log(selectedProjectTasks[0], selectedProjectTasks[1], selectedProjectTasks[2]); 
 

 
//then you can do your comparisions 
 
var value = [], checked; 
 
value['id'] = 123; 
 

 
if (($.grep(selectedProjectTasks, function(n) { return n == value['id']; })) != '[]') { 
 
    checked = 'checked'; 
 
} else { 
 
    checked = ''; 
 
} 
 

 
console.log(checked);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>