Pertanyaan Javascript Array vs Php Array


Saya memiliki dua versi blok kode yang identik di php dan javascript. Outputnya sedikit berbeda. Ada dua elemen "tidak terdefinisi" dalam output Javascript. Saya tahu bahwa indeks Javascript Array adalah inkremental yang dimulai dari 0 dan tidak memungkinkan kita untuk melewati nomor indeks mana pun.

Apakah ada pula untuk menyelesaikan ini sehingga output Javascript Array seperti Php Array?

Kode Php:

$n = array();
$n[0] = 'Apple';
$n[3] = 'Apple';
echo "<pre>";
print_r( $n );
echo "</pre>";

Keluaran:

Array
(
    [0] => Apple
    [3] => Apple
)

Kode Javascript:

var n = new Array();
n[0] = 'Apple';
n[3] = 'Apple';
n;

Keluaran:

[
    "Apple", 
    undefined, 
    undefined, 
    "Apple"
]

Terima kasih!!


9
2017-08-20 05:41


asal


Jawaban:


Seperti yang Anda sebutkan Array JavaScript memiliki batasan indeks.

Cara terdekat Anda bisa mendapatkan hasil yang Anda cari adalah dengan menggunakan Objek JavaScript.

Jika kemudian Anda gunakan JavaScript JSON merangkai untuk mengubah objek menjadi teks yang diformat dengan baik, Anda akan mendapatkan hasil yang hampir identik dengan sedikit usaha.

Anda dapat menulis JavaScript tambahan untuk memiliki output persis mencerminkan output PHP. Tapi aku akan menyerahkannya padamu.

var n = new Object();
n[0] = 'Apple';
n[3] = 'Apple';

var output = JSON.stringify(n, null, 2);

// Output to a pre tag like the PHP example you gave.
document.getElementById("output").innerHTML = output;

// Simple output to the console.
console.log(output);
<pre id="output"></pre>


19
2018-02-02 06:34



Saya pikir dalam kasus Anda lebih baik untuk menggunakan objek, bukan array, seperti di JS associative array objek yang sama. F.e.

var n = {};
n[0] = 'Apple';
n[3] = 'Apple';
console.log(n);

itu akan keluar

Object {0: "Apple", 3: "Apple"}

DIEDIT Anda bisa mendapatkan elemen dari objek seperti dalam larik:

n[0], n[3]

6
2017-08-20 05:51



PHP Arrays adalah Hash Tables, Javascript Arrays adalah daftar yang diindeks

Jawaban singkat

Tidak. Tidak ada cara untuk membuat array Javascript berperilaku seperti php array tanpa melanggar standar ECMA (yang berarti itu secara teknis tidak lagi javascript).

Iya nih. Tetapi hanya dengan mengganti perilaku prototipe Array bawaan.

Lihat ECMA-262 Bagian 15.4 Objek Array

Apa itu array?

Array adalah data yang dipesan  dan tidak ada lagi. Sementara array memang memiliki index, konsep array "index" tidak boleh digabungkan dengan konsep penyimpanan data berlabel. Indeks array selalu berurutan, karena menunjuk ke posisi dalam array, mirip dengan posisi orang dalam satu baris.

Anda tidak bisa membuat garis orang dengan satu orang terlebih dahulu, dan satu orang keempat, dan tidak ada orang lain dalam antrean. n[0] = 'first'; n[3] = 'fourth;

Ini adalah bagaimana array didefinisikan dalam hampir setiap bahasa pemrograman, karena itu adalah bagaimana data disimpan dalam memori.

Gunakan Objek Sebagai gantinya

Ini adalah jawaban yang sama yang sudah diberikan banyak orang lain untuk pertanyaan ini. Pada akhirnya Array javascript hanyalah jenis objek yang telah ditentukan, dibangun untuk berperilaku seperti diuraikan di atas. Dengan demikian, perilaku yang Anda coba ubah, sebenarnya adalah perilaku yang telah direkayasa secara hati-hati.

Jadi, alih-alih menggunakan objek "Array" khusus, gunakan kunci string (sebagai objek bernama properti) dan seluruh masalah Anda disederhanakan.

catatan: ini pada dasarnya apa yang orang lain 'Gunakan suatu objek' di sini, dengan satu pengecualian.

n['0'] = 'Apple';
n['3'] = 'Apple';

// OR

n = {
    '0': 'Apple',
    '3': 'Apple',
};

// numeric keys are possible, IFF the var is first explicitly defined as an object.
n = {};
n[0] = 'Apple';
n[3] = 'Apple';

Objek tidak cukup, itu pasti Array? Gulung objek kontainer "Array" Anda sendiri.

Kekurangannya di sini adalah Anda harus menentukan secara manual semua panggilan metode yang ingin Anda lewati ke objek array itu sendiri.

var PhpArray = function(ary){
    if (ary instanceof Array) {
        this.ary = ary;
    } else {
        this.ary = new Array(ary);
    }
};

PhpArray.prototype.forEach = function(f){
    for(i in this.ary){
        if (this.ary[i] !== undefined && this.ary[i] !== null) {
            f(i, this.ary[i]);
        }
    }
};

PhpArray.prototype.toString = function(){
    var strResult '';
    this.forEach(function(k, val){
        switch(typeof val) {
            case 'boolean':
            case 'string':
            case 'number':
                strResult += k + ': ' + val;
                break;
            default:
                if (val.toString) {
                    strResult += k + ': ' + val.toString();
                } else {
                    strResult += k + ': ' + typeof val;
                }
        }
    });
};

// Usage:
var n = Array();
n[0] = 'Apple';
n[3] = 'Apple';
var x = new PhpArray(n);
console.log('' + x);

x.ary[5] = 'Pear';

Masih belum cukup baik? "Ubah Perilaku Array !?" kamu bilang?

Ingin mengakses x[3] = 'Apple'; dari contoh di atas?

Atau mungkin Anda benar-benar ingin mengganti prototipe Array bawaan?

Nah gesper sabuk pengaman Anda Dorothy, karena javascript akan tinggal dah. Itu benar, kita akan pergi ke suatu tempat di ECMA di mana Anda dapat melakukan apa pun yang Anda inginkan. Tentu, pengembang lain akan membenci Anda, dan alat pihak ketiga (jQuery) tidak akan berfungsi lagi, tetapi setidaknya Anda akan memiliki Array javascript Anda yang tidak array.

Sayangnya, saya tidak akan membantu Anda melakukan itu.


4
2018-02-08 01:43



Alasan kamu mendapatkan "tidak terdefinisi"nilai-nilai adalah bahwa Javascript menggantikan setiap indeks yang hilang / kosong dalam daftar kunci array dengan nilai"tidak terdefinisi", mis. indeks 1 dan 2 dalam kasus Anda.

Daripada menambahkan elemen ke array Anda dengan nama kunci, cukup tekan ke ujung array:

n.push("Apple");

Catatan! Ini tentu saja akan menyebabkan indeks nilai-nilai dalam Javascript menjadi berbeda dari skrip PHP Anda, karena menggunakan push akan selalu menyisipkan nilai ke ujung array. Yang mengatakan, untuk membuat insert dengan cara yang sama di kedua skrip, saya akan menyarankan Anda menggunakan PHP array_push metode, yang bekerja dengan cara yang sama seperti metode push Javascript. Alternatifnya, Anda dapat menggunakan pendekatan yang sama seperti yang Anda lakukan sekarang untuk skrip PHP, tetapi selalu menyisipkan di ujung larik, misalnya:

$n[0] = 'Apple';
$n[1] = 'Apple';

1
2017-08-20 06:11



Ini perlu dicatat bahwa iterasi variabel multidimensional dalam js sedikit berbeda dari php.

PHP

$myArray = [0=>'here',1=>'we',2=>'go'];
for($i=0;$i<count($myArray);$i++){ echo $myArray[$i]; }
// or 
foreach($myArray as $item){ echo $item; }

javaScript Ada cara untuk mendapatkan panjang objek, tetapi itu bisa jadi rumit, jadi:

myObject = {0:'here',1:'we',2:'go'};
for(item in myObject){ console.log(myObject[item]) }

1
2018-02-07 20:56



Dalam kode JS Anda lakukan:

n = n.filter(function(n){ return n != undefined });
console.log(n);

Ini harus menghilangkan elemen yang tidak terdefinisi.  dan output:

[
    "Apple", 
    "Apple"
  ]

Perhatikan bahwa di php jika Anda melakukannya:

echo $n[1] ; 

kamu akan mendapatkan:
Perhatikan: Offset tidak terdefinisi: 1 pada .....


0
2018-02-03 09:01



Di Javascript Array ia menggunakan indeks untuk menemukan nilainya, jadi jika tidak menemukan nilai apa pun dalam indeks itu, ia menetapkannya sebagai tidak terdefinisi atau kosong sehingga untuk menghapus tidak terdefinisi kita dapat menggunakan fungsi ini.

 Array.prototype.remove = function(deleteValue) {
      for (var i = 0; i < this.length; i++) {
        if (this[i] == deleteValue) {         
          this.splice(i, 1);
          i--;
        }
      }
      return this;
    };

    var a = [];
    a[0] = 'zero';
    a[3] = 'three';
    a.remove(undefined);

0
2018-02-08 06:43



Seperti yang saya lihat, banyak jawaban yang disarankan. Jika Anda hanya ingin menunjukkan data saja, bukan untuk rilis produksi. Anda dapat mengganti toString metode untuk tujuan demo. Di bawah ini adalah snippet yang diberikan.

// Override toString
Array.prototype.toString = function () {
    return this.filter(x => x)
};

//How to use it
var n = new Array();
n[0] = 'Apple';
n[3] = 'Apple';
console.log(n.toString());

Mengapa Anda harus menggunakan toString di console.log. 

Apakah log konsol memanggil metode toString dari suatu objek


-1
2018-02-05 06:31