मैं एक 2d सरणी की प्रतिलिपि बनाने की कोशिश कर रहा हूं, लेकिन हर बार जब मैं कॉपी किए गए सरणी का मान बदलता हूं, तो यह मूल को भी बदल देता है।

मूल सरणी

 board = [
        [0,1,0],
        [0,0,1],
        [1,1,1],
        [0,0,0]
      ];
let ans = board.slice();
    
    for(let i=0; i<board.length; i++){
        for(let j=0; j<board[i].length; j++){
            let neighbors = checkCell(board, i, j);
            if(board[i][j] === 1) {
                ans[i][j] = (neighbors === 2 || neighbors === 3 ? 1 : 0);
            } else {
                ans[i][j] = (neighbors === 3 ? 1 : 0);
            }
        }
    }

CheckCell() सिर्फ एक तरीका है जो 1 या 0 देता है। मेरी समस्या यह है कि जब मैं ans पर एक मान सेट करता हूं, तो यह मूल board सरणी को भी बदल देता है। मैंने and = [...board]; का उपयोग करके कॉपी करने की कोशिश की और वही समस्या आई।

0
myTest532 myTest532 29 जून 2020, 18:00

2 जवाब

सबसे बढ़िया उत्तर

जब आप .slice या [...] के माध्यम से कॉपी करते हैं तो यह एक उथली कॉपी करता है, जिसका अर्थ है कि बाहरी सरणी कॉपी की गई है लेकिन आंतरिक सरणियां नहीं हैं। आप प्रत्येक तत्व को व्यक्तिगत रूप से कॉपी कर सकते हैं:

let ans = board.map(v => v.slice()); // copies every 1d array
3
Aplet123 29 जून 2020, 18:03

ऐसा इसलिए हो रहा है क्योंकि स्लाइस () विधि तत्वों की एक उथली प्रतिलिपि लौटाती है और जिस तरह से तत्वों की प्रतिलिपि बनाई जाती है वह संदर्भों का उपयोग कर रहा है, यानी मूल और नई सरणी दोनों एक ही वस्तु को संदर्भित करते हैं। यदि कोई संदर्भित ऑब्जेक्ट बदलता है, तो परिवर्तन नए और मूल सरणियों दोनों के लिए दृश्यमान होते हैं।

स्लाइस का उपयोग केवल तभी करें जब आप कुछ अन्य आउटपुट उत्पन्न करने के लिए मूल सरणी की उथली प्रतिलिपि चाहते हैं।

आप अधिक यहां

1
Aman-D 29 जून 2020, 18:19