搜尋

首頁  >  問答  >  主體

javascript - vue2 如何去除帶__ob__這樣的資料?

data: function () {
    return {
        cityData: cityData,
        selectedOptions:this.source[this.schema_key]
    }
}

console上面的this.source[this.schema_key]如下

[24, 81, __ob__: Observer]

有麼有一種方式可以直接這樣取得這樣資料

[24, 81]
给我你的怀抱给我你的怀抱2793 天前1747

全部回覆(3)我來回復

  • PHPz

    PHPz2017-05-19 10:23:14

    __ob__: Observer這些資料是vue這個框架對資料設定的監控器,一般都是不可枚舉的。

    console.log这样的打印函数,被打印的变量会执行自身的toString(),這樣,即便內部屬性是不可枚舉,實際上也能看到。舉個例子:

    const obj = {
        a: 0,
        b: 1
    };
    Object.defineProperty(obj, 'b', {
        writable: false,
        enumerable: false,
        configurable: false
    });
    
    console.log(obj);    // Object {a: 0, b: 1}

    因為你已經將資料綁定在了vue之中,vue就肯定要為資料添加監控器的,如果你強制刪掉了這些監控器,那麼這些資料也就失去了監控,那麼你使用vue的意義何在…


    如果只是去掉這些監視器而不考慮後果的話,把物件複製一份就行了,因為複製的物件是不包含不可枚舉屬性的。

    const obj1 = {
        a: 0,
        b: 1
    };
    Object.defineProperty(obj1, 'b', {
        writable: false,
        enumerable: false,
        configurable: false
    });
    const obj2 = Object.assign({}, obj1);
    
    console.log(obj2);    // Object {a: 0}

    js這類動態語言,複製物件是個很頭痛的事情。我寫了一個簡單的,可以參考一下:

    //对象深复制,不考虑循环引用的情况
    function cloneObj(from) {
        return Object.keys(from)
            .reduce((obj, key) => (obj[key] = clone(from[key]), obj), {});
    }
    //数组深复制,不考虑循环引用的情况
    function cloneArr(from) {
        return from.map((n) => clone(n));
    }
    // 复制输入值
    function clone(from) {
        if (from instanceof Array) {
            return cloneArr(from);
        } else if (from instanceof Object) {
            return cloneObj(from);
        } else {
            return (from);
        }
    }
    
    const obj = [
        {
            name: '1'
        },
        {
            name: '2'
        }
    ];
    const obj2 = clone(obj);
    console.log(obj2);

    在外面直接用clone()方法就行了。

    回覆
    0
  • 高洛峰

    高洛峰2017-05-19 10:23:14

    這個對數據沒有影響吧~

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:23:14

    同樣,求解。 。 。 。

    回覆
    0
  • 取消回覆