LoginSignup
2
0

More than 3 years have passed since last update.

JavaScriptの配列の挙動に戸惑ったのでメモ

Last updated at Posted at 2019-11-23

js初心者が必要に迫られて書くことになったのでleetcodeで日々是筋トレ。
JavaScriptの配列の挙動に戸惑ったのでメモを残します。
配列挙動に戸惑ったわけではなく、コメントでご指摘いただいた通り、単純にvarのつけ忘れでした。。

今回詰まった問題はこちら
https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/

ソート済みの配列を二分探索木にしてというもの。

下記のようなサンプルを作ってみた。

最初に作ったもの.js
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var sortedArrayToBST = function(nums) {
    if (nums.length == 0) {
        return null
    }
    if (nums.length == 1) {
        return new TreeNode(nums[0])
    }

    midIdx = Math.floor(nums.length / 2)
    mid = nums[midIdx]

    console.log(nums.slice(midIdx+1)) // デバッグで追加
    var ans = new TreeNode(mid)
    ans.left = sortedArrayToBST(nums.slice(0, midIdx))

    console.log("-----") // デバッグで追加
    console.log(nums.slice(midIdx+1)) // デバッグで追加
    ans.right = sortedArrayToBST(nums.slice(midIdx+1))

    return ans;
};

入力: [-10,-3,0,5,9]

コンソール:

[ 5, 9 ]
[]
-----
[]
-----
[ 0, 5, 9 ]
[ 9 ]
-----
[ 9 ]

ファッッッ! nums.slice(midIdx+1) の値が再帰関数を呼び出すと値が変わってしまっている。。。

仕方なしに下記のように再帰関数を呼び出す前に違う変数 nums2 に格納して対応。

correct.js
var sortedArrayToBST = function(nums) {
    if (nums.length == 0) {
        return null
    }
    if (nums.length == 1) {
        return new TreeNode(nums[0])
    }

    midIdx = Math.floor(nums.length / 2)
    mid = nums[midIdx]

    var nums2 = nums.slice(midIdx+1)
    var ans = new TreeNode(mid)
    ans.left = sortedArrayToBST(nums.slice(0, midIdx))
    ans.right = sortedArrayToBST(nums2)

    return ans;
};

無事動いてくれましたが、原因不明です。
参照渡しになって勝手に変数が書き変わってしまうのでしょうか...
もっとjs詳しくならねばと思う今日この頃でした。。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0