JavaScript Odpowiednik PHP Explode ()

353

Mam ten ciąg:

0000000020C90037: TEMP: dane

Potrzebuję tego ciągu:

TEMP: dane.

Z PHP zrobiłbym to:

$str = '0000000020C90037:TEMP:data';
$arr = explode(':', $str);
$var = $arr[1].':'.$arr[2];

Jak skutecznie explodenapisać ciąg w JavaScript, tak jak działa w PHP?

Doug Molineux
źródło

Odpowiedzi:

607

To jest bezpośrednia konwersja z twojego kodu PHP:

//Loading the variable
var mystr = '0000000020C90037:TEMP:data';

//Splitting it with : as the separator
var myarr = mystr.split(":");

//Then read the values from the array where 0 is the first
//Since we skipped the first element in the array, we start at 1
var myvar = myarr[1] + ":" + myarr[2];

// Show the resulting value
console.log(myvar);
// 'TEMP:data'
John Hartsock
źródło
75
należy zauważyć, że tablica zaczyna się od [0]
Herr
52
@Herr Kaleun ... To zrozumiałe ... Ale OP chciał dwa ostatnie elementy w tablicy.
John Hartsock
4
+1: Zgadza się; oto link z MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . I w przeciwnym kierunku, więc odpowiednikiem implode () PHP jest myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Sk8erPeter
12
UWAGA : split(delimiter,limit)parametr limitu NIE działa tak samo jak explode($delimiter,$string,$limit)parametr limitu. Przykład: explode('.','1.2.3.4',3) === array('1','2','3.4')- podczas gdy w JavaScript, dostaniesz: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Czy ktoś wie, jak łatwo powielić metodę PHP?
Nathan JB
1
Dodałem komentarze do kodu, aby wyczyścić tablicę [0], może wprowadzać w błąd początkujących ...
NDM
46

Nie musisz się dzielić. Możesz użyć indexOfi substr:

str = str.substr(str.indexOf(':')+1);

Ale odpowiednikiem explodebyłoby split.

Felix Kling
źródło
5
Ktoś prawdopodobnie myślał, że jesteś wredny. Czasami musisz wszystko wyjaśnić. Np. „Twój problem najlepiej rozwiązać poprzez„ indexOf ”... ale„ split ”dosłownie odpowiada na twoje pytanie.”
Joel Mellon
Downvoter: „Jak śmiesz zapewniać prostsze i wydajniejsze rozwiązanie zamiast weryfikować moje uprzedzenia?”
jchook
37
String.prototype.explode = function (separator, limit)
{
    const array = this.split(separator);
    if (limit !== undefined && array.length >= limit)
    {
        array.push(array.splice(limit - 1).join(separator));
    }
    return array;
};

Powinien dokładnie naśladować funkcję explode () PHP.

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']
psycho brm
źródło
7
Uznanie za bycie JEDYNYM , o ile widzę, dostarczenie RZECZYWISTEGO odpowiednika funkcji eksplozji PHP (zgodnie z pierwotnym pytaniem).
faazshift
1
Cóż za proste i eleganckie rozwiązanie, chciałbym, żeby to była zaakceptowana odpowiedź.
soger
28

Wygląda na to, że chcesz się podzielić

Quentin
źródło
9

Spróbuj tego:

arr = str.split (":");
weltraumpirat
źródło
6

create jest obiektem:

// create a data object to store the information below.
    var data   = new Object();
// this could be a suffix of a url string. 
    var string = "?id=5&first=John&last=Doe";
// this will now loop through the string and pull out key value pairs seperated 
// by the & character as a combined string, in addition it passes up the ? mark
    var pairs = string.substring(string.indexOf('?')+1).split('&');
    for(var key in pairs)
    {
        var value = pairs[key].split("=");
        data[value[0]] = value[1];
    }

// creates this object 
    var data = {"id":"5", "first":"John", "last":"Doe"};

// you can then access the data like this
    data.id    = "5";
    data.first = "John";
    data.last  = "Doe";
JM Design
źródło
7
Wydaje się to trochę przesadne, jednak za odpowiedź
Doug Molineux
4

Użyj String.split

"0000000020C90037:TEMP:data".split(':')

Niemiecki Rumm
źródło
4

Jeśli lubisz php, spójrz na php.JS - JavaScript eksploduje

Lub w normalnej funkcjonalności JavaScript: `

var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `
eriksv88
źródło
Chciałem na nią spojrzeć, ale przede mną dostałem bałagan w JavaScript. Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel,
Nie powiedziałem, że jest to najlepsze rozwiązanie, ale jest to dobre rozwiązanie, jeśli jesteś nowy w JavScript i znasz php. Ale był powód, dla którego napisałem inny przykład. :) „Niech to będzie głupie!”;)
eriksv88,
Brzmi rozsądnie, ale myślę, że nie należy przekształcać jednego języka programowania w inny; może to być mylące dla początkujących, którzy mogą myśleć, że OOP w JavaScript jest jak OOP w C ++. Co więcej, ktoś może po prostu skopiować wklejoną funkcję i pomyśleć, że trzeba w ten sposób zdefiniować tablice.
Marcel Korpel,
Tak, całkowicie się z tym zgódź! Ale tak naprawdę nie dostaje kodu w jego ręce. i to wszystko. Jeśli zna php, to może tęskni za małymi rzeczami w php. Najlepsza logika Mam na myśli logikę, a nie rozwiązanie kopiowania pasteli, nigdy nie ma dobrego rozwiązania! Z mojego doświadczenia wynika, że ​​w dniu, w którym zdajesz sobie sprawę, że trzeba się wiele nauczyć, wtedy jesteś na dobrej drodze.
eriksv88,
+1 O ile widzę, jest to jedyne rozwiązanie, które działa tak samo jak PHP. Jeśli ogranicznik nie zostanie znaleziony, wynikiem będzie oryginalny ciąg znaków. explode('foo','bar'); // 'bar'To jest powód, dla którego tu przybyłem i dla moich celów skrypt kopiuj i wklej, którego zamierzam używać z ograniczeniami, jest absolutnie doskonały. Nie muszę dać się wciągnąć w tworzenie własnego. Po co w końcu wymyślać koło, pocałuj
Andy Gee,
4

console.log(('0000000020C90037:TEMP:data').split(":").slice(1).join(':'))

wyjścia: TEMP:data

  • .split () rozłoży ciąg na części
  • .join () ponownie składa tablicę z powrotem na ciąg
  • jeśli chcesz tablicy bez jej pierwszego elementu, użyj .slice (1)
exebook
źródło
Ta odpowiedź powinna mieć 554 głosów pozytywnych, a nie zaakceptowaną. Ponadto przez ostatnie 3 lata zaakceptowana odpowiedź była całkowicie błędna , łącząc wskaźniki 0 i 1, gdy OP poprosił o 1 i 2.
NobleUplift
2

Bez zamiaru krytykowania Johna Hartsocka , na wypadek gdyby liczba ograniczników mogła się różnić dla każdego, kto używa tego kodu, formalnie sugeruję użycie tego zamiast ...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];
Dylan Maxey
źródło
1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"
Ruben Kazumow
źródło
Bardzo dowcipna odpowiedź. Zastanawiam się, jak dobrze sobie radzi w porównaniu do tradycyjnego podziału.
NobleUplift
1

Tylko mały dodatek do odpowiedzi psycho brm (jego wersja nie działa w IE <= 8). Ten kod jest kompatybilny z różnymi przeglądarkami:

function explode (s, separator, limit)
{
    var arr = s.split(separator);
    if (limit) {
        arr.push(arr.splice(limit-1, (arr.length-(limit-1))).join(separator));
    }
    return arr;
}
Efi Nuhr
źródło
0

Wiem, że ten post jest dość stary, ale pomyślałem, że równie dobrze mogę dodać funkcję, która pomogła mi przez lata. Dlaczego po prostu nie przerobić funkcji rozstrzelenia przy użyciu podziału, jak wspomniano powyżej? Cóż, oto:

function explode(str,begin,end)
{
   t=str.split(begin);
   t=t[1].split(end);
   return t[0];
}

Ta funkcja działa dobrze, jeśli próbujesz uzyskać wartości między dwiema wartościami. Na przykład:

data='[value]insertdataherethatyouwanttoget[/value]';

Jeśli chciałbyś uzyskać informacje pomiędzy dwoma „znacznikami” [wartości], możesz użyć tej funkcji w następujący sposób.

out=explode(data,'[value]','[/value]');
//Variable out would display the string: insertdataherethatyouwanttoget

Powiedzmy jednak, że nie masz tych przydatnych „tagów”, jak w powyższym przykładzie. Bez znaczenia.

out=explode(data,'insert','wanttoget');
//Now out would display the string: dataherethatyou

Chcesz zobaczyć to w akcji? Kliknij tutaj .

Ramity
źródło
0
var str = "helloword~this~is~me";
var exploded = str.splice(~);

zmienna rozstrzelona zwróci tablicę i możesz uzyskać dostęp do elementów tablicy, dostęp do niej prawda rozstrzelona [n-ty] gdzie n-ty jest indeksem wartości, którą chcesz uzyskać

Abdullahi Mako Ayuba
źródło
2
To nawet nie działa! splice akceptuje 2 cyfry i ciągi jako parametry, a nie a ~(powoduje to błąd składniowy). I składania nie jest do tego celu, jest to, aby uzyskać / wyjąć elementy z lub dodać do tablicy.
CPHPython
0

spróbuj tak

ans = str.split (":");

I możesz użyć dwóch części sznurka, takich jak:

ans [0] i ans [1]

meignanamoorthy ks
źródło
2
Być może wyjaśnij, czym różni się to od zaakceptowanej odpowiedzi opublikowanej 8 lat temu.
Lece
0

Użyłem wycinania, dzielenia i łączenia Możesz napisać tylko jedną linię kodu

      let arrys = (str.split(":").slice(1)).join(":");
Pharis Kahama
źródło
0

Jeśli chcesz zdefiniować własną funkcję, spróbuj tego:

function explode (delimiter, string, limit) {
  if (arguments.length < 2 ||
    typeof delimiter === 'undefined' ||
    typeof string === 'undefined') {
    return null
  }
  if (delimiter === '' ||
    delimiter === false ||
    delimiter === null) {
    return false
  }
  if (typeof delimiter === 'function' ||
    typeof delimiter === 'object' ||
    typeof string === 'function' ||
    typeof string === 'object') {
    return {
      0: ''
    }
  }
  if (delimiter === true) {
    delimiter = '1'
  }

  // Here we go...
  delimiter += ''
  string += ''

  var s = string.split(delimiter)

  if (typeof limit === 'undefined') return s

  // Support for limit
  if (limit === 0) limit = 1

  // Positive limit
  if (limit > 0) {
    if (limit >= s.length) {
      return s
    }
    return s
      .slice(0, limit - 1)
      .concat([s.slice(limit - 1)
        .join(delimiter)
      ])
  }

  // Negative limit
  if (-limit >= s.length) {
    return []
  }

  s.splice(s.length + limit)
  return s
}

Zaczerpnięte z: http://locutus.io/php/strings/explode/

harish sharma
źródło
-1

Kod Feliksa Klinga jest dynamiczny (w przeciwieństwie do przyjętej odpowiedzi), jednak początkowy przykładowy ciąg znaków jest okropnym punktem wyjścia. Aby wizualnie zademonstrować swoją odpowiedź (po prostu odpowiada na pytanie) dla tych, którzy chcą jakości i szybkości:

    var s = '1:2:3:4:5:6';
    console.log(s);
    s = s.substr(s.indexOf(':')+1);
    console.log(s);

Jan
źródło