Вам нужна копия raw
, потому что raw
в variants
- это просто ссылка, указывающая на тот же объект.Вот почему вы получили три одинаковых значения.
add() {
let self = this
for (let i = 0; i < self.options[0].values.length; i++) {
(function (i, p) {
var raw = p;
raw.option_1 = self.options[0].values[i];
self.variants.push(JSON.parse(JSON.stringify(raw)));
})(i, self.p);
}
// this.options[0].values.forEach(v => {
// this.variants.push({ option_1: v })
// })
}
Код в комментарии - более элегантный способ.
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.min.js"></script>
<div id="app">
<mytag></mytag>
</div>
<script>
let mytag = Vue.component("mytag", {
template: `<div><button @click="add">add</button><p>this.variants:{{this.variants}}</p></div>`,
data() {
return {
options: [{
values: ["a", "b", "c"]
}],
variants: [],
p: {
option_1: null
}
};
},
methods: {
add() {
let self = this
for (let i = 0; i < self.options[0].values.length; i++) {
(function(i, p) {
var raw = p;
raw.option_1 = self.options[0].values[i];
self.variants.push(Object.assign({}, raw));
//self.variants.push(JSON.parse(JSON.stringify(raw)));
})(i, self.p);
}
// this.options[0].values.forEach(v => {
// this.variants.push({ option_1: v })
// })
}
}
});
new Vue({
el: '#app',
components: {
mytag
}
})
</script>
В конце концов, вам лучше узнать что-нибудь о том, как спрашивать!