2012-02-08 32 views
10

Tôi có cấu trúc này:Làm cách nào để chuyển giá trị thay vì tham chiếu của một mảng?

var a = []; 
a.push({"level": 1, "column": 4, "parent": "none", "title": "Node 0", "content": "Parintele suprem", "show": "1"}); 
var b = a; 

a.push({"level": 1, "column": 5, "parent": "none", "title": "Node 1", "content": "Parintele suprem", "show": "1"}); 

console.log(b); 

Bây giờ vấn đề là b có nội dung chính xác như a (các nội dung sau khi đẩy thứ hai). Điều này gợi ý (sửa tôi nếu tôi sai) khi tôi nói b = a Tôi thực sự đã cung cấp cùng một tham chiếu như một, vì vậy bất cứ điều gì tôi làm trong a Tôi có trong b. Vấn đề là tôi cần phải vượt qua giá trị. Vì vậy, tôi có các bản xem trước a, giá trị trong b.

Chỉnh sửa để làm cho câu hỏi rõ ràng hơn: Làm cách nào để chuyển giá trị thay vì tham chiếu?

+0

"Vấn đề là tôi cần phải chuyển giá trị. Vì vậy, tôi có xem trước một giá trị trong b. "Hoặc để đánh vần nó như một câu hỏi:" Làm thế nào để vượt qua giá trị thay vì tham chiếu? ". – zozo

Trả lời

13

Tôi nghĩ rằng bạn có thể sử dụng để sao chép các giá trị thay vì các tài liệu tham khảo:

var b = a.slice(0); 

EDIT
Theo các ý kiến ​​đã đề cập và nó cũng đề cập ở đây: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

lát không thay đổi mảng ban đầu, nhưng trả về một bản sao "một mức sâu" mới chứa các bản sao của các phần tử được cắt từ mảng ban đầu. Các yếu tố của các mảng ban đầu được sao chép vào mảng mới như sau:

  • Đối với tài liệu tham khảo đối tượng (và không phải là đối tượng thực tế), bản sao lát đối tượng tài liệu tham khảo vào mảng mới. Cả mảng gốc và mảng mới đều đề cập đến cùng một đối tượng. Nếu đối tượng được tham chiếu thay đổi, các thay đổi hiển thị cho cả mảng mới và mảng gốc.

  • Đối với chuỗi và số (không phải đối tượng chuỗi và số), lát cắt chuỗi và số vào mảng mới. Các thay đổi đối với chuỗi hoặc số trong một mảng không ảnh hưởng đến mảng khác.

Nếu phần tử mới được thêm vào mảng, mảng kia sẽ không bị ảnh hưởng.

+1

Làm việc như một giấc mơ :) .Tôi chưa thể chấp nhận câu trả lời , nhưng tôi sẽ trong 7 phút (khi ngăn xếp sẽ cho phép tôi) – zozo

+2

Điều đó chỉ hoạt động cho các mảng được lập chỉ mục số, phải không? –

+0

Dường như vậy .Tôi sẽ thực hiện kiểm tra nhanh sau khi hoàn thành tác vụ hiện tại :). có nhiều hơn 1 câu trả lời hợp lệ Tôi sẽ làm cho một bài trả lời phù thủy sẽ nhanh hơn ... từ bài kiểm tra nhanh của tôi có vẻ như lát, nhưng kể từ khi tôi không có một lời giải thích hợp lý tôi không thể chắc chắn. 01 – zozo

3

Vâng, đó là cách phân công tham chiếu hoạt động trong javascript. Bạn muốn sao chép đối tượng để tạo bản sao, thật không may là có liên quan nhiều hơn mức cần thiết. Các khung như MooTools cung cấp giải pháp đơn giản nhất, hoặc bạn có thể cuộn hàm clone của riêng bạn.

7

bạn có thể thực hiện một bản sao phương pháp như sau:

function clone(source) { 
    var result = source, i, len; 
    if (!source 
     || source instanceof Number 
     || source instanceof String 
     || source instanceof Boolean) { 
     return result; 
    } else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') { 
     result = []; 
     var resultLen = 0; 
     for (i = 0, len = source.length; i < len; i++) { 
      result[resultLen++] = clone(source[i]); 
     } 
    } else if (typeof source == 'object') { 
     result = {}; 
     for (i in source) { 
      if (source.hasOwnProperty(i)) { 
       result[i] = clone(source[i]); 
      } 
     } 
    } 
    return result; 
}; 

thì:

var b = clone(a); 

nếu bạn chắc chắn rằng a là mảng, chỉ sử dụng Niklas của:

var b = a.slice(); 

ps: tiếng anh của tôi kém:

Các vấn đề liên quan