Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Vue computed属性更改数据对象_Javascript_Vue.js_Vuejs2_Vue Component - Fatal编程技术网

Javascript Vue computed属性更改数据对象

Javascript Vue computed属性更改数据对象,javascript,vue.js,vuejs2,vue-component,Javascript,Vue.js,Vuejs2,Vue Component,我的数据基本上是这样的结构(this.terms): 然后我输出计算结果,这样人们就可以通过标记过滤这个.terms computed: { filteredTerms: function() { let self = this; let terms = this.terms; // copy original data to new var if(this.search.tags) { return terms.

我的数据基本上是这样的结构(this.terms):

然后我输出计算结果,这样人们就可以通过标记过滤这个.terms

computed: {
    filteredTerms: function() {
        let self = this;
        let terms = this.terms; // copy original data to new var

        if(this.search.tags) {
            return terms.filter((term) => {
                let updated_term = {}; // copy term to new empty object: This doesn't actually help or fix the problem, but I left it here to show what I've tried.
                updated_term = term;

                let updated_posts = term.posts.filter((post) => {
                    if (post.tags.includes(self.search.tags)) {
                        return post;
                    }
                });

                if (updated_posts.length) {
                    updated_term.posts = updated_posts; // now this.terms is changed even though I'm filtering a copy of it
                    return updated_term;
                }
            });
        } else {
            return this.terms; // should return the original, unmanipulated data
        }
    }
},
filteredTerms()返回类别,其中仅包含匹配的文章。因此,搜索“愤怒”只会返回“第二类”,只列出“雨果编织”

问题是,运行计算函数会更改this.terms中的第二个类别,而不仅仅是该函数中它的副本(terms)。它不再含有蛇皮。我把范围缩小到更新的帖子。这一行似乎也改变了这一点。我唯一能做的就是重置整个数据对象并重新开始。这不太理想,因为它会一直在加载内容。我需要先加载这个.terms,并保持不变,以便在有人清除其搜索条件后恢复到它

我尝试过使用lodash版本的filter和includes(尽管我真的没想到会有什么不同)。我尝试使用更复杂的方法来处理for循环和.push()而不是过滤器


我错过了什么?感谢您花时间查看此内容。

尝试克隆对象而不是引用它,您应该执行以下操作:

   let terms = [];
   Object.assign(terms,this.terms);
让terms=this.terms

这并不复制数组,它只保存对This.terms的引用。原因是JS对象和数组是引用类型。这是一个有用的视频:


无论如何,请使用
this.terms.slice()
复制数组。如果它是一个对象,您可以使用
{…this.terms}

我用以下内容更新了我的计算函数:

let terms = [];
for (let i = 0; i < this.terms.length; i++) {
    const term = this.copyObj(this.terms[i]);
    terms.push(term);
}

谢谢让我走上正确的道路!事实上,我不得不在术语数组中循环并在术语对象上运行Object.assign,但它正确地克隆了我的原始数据。很棒的视频!谢谢你的回复。今天我学到了一些新东西。
let terms = [];
for (let i = 0; i < this.terms.length; i++) {
    const term = this.copyObj(this.terms[i]);
    terms.push(term);
}
copyObj: function (src) {
    return Object.assign({}, src);
}