Способ решения этой проблемы состоит в том, чтобы разделить проблему на шаги:
Поскольку вы хотите отсортировать массив, вы хотите вызвать endArray.sort((a, b) => {})
На что вы хотитеСортировать?Индекс, в котором можно найти идентификатор:
endArray.sort((a, b) => {
let indexA;
for(indexA = 0; indexA < this.order.length; indexA++) {
if (this.order[indexA].id === a) break;
}
let indexB;
for(indexB = 0; indexB < this.order.length; indexB++) {
if (this.order[indexB].id === b) break;
}
// ...
})
Как мы хотим его отсортировать?по возрастанию:
endArray.sort((a, b) => {
let indexA;
for(indexA = 0; indexA < this.order.length; indexA++) {
if (this.order[indexA].id === a) break;
}
let indexB;
for(indexB = 0; indexB < this.order.length; indexB++) {
if (this.order[indexB].id === b) break;
}
if (indexA > indexB) return 1;
if (indexB > indexA) return -1;
return 0;
})
Когда мы хотим отсортировать это?Когда order
или newArray
изменяется:
new Vue({
el: '#app',
data: {
orderString: '[{"id":35},{"id":34},{"id":32},{"id":30},{"id":28},{"id":24},{"id":17},{"id":15},{"id":3}]',
newArrayString: '[34, 35, 32]',
},
computed: {
order() {
return JSON.parse(this.orderString);
},
newArray() {
return JSON.parse(this.newArrayString);
},
result() {
// Make a copy to prevent editing the original data
return [...this.newArray].sort((a, b) => {
let indexA;
for(indexA = 0; indexA < this.order.length; indexA++) {
if (this.order[indexA].id === a) break;
}
let indexB;
for(indexB = 0; indexB < this.order.length; indexB++) {
if (this.order[indexB].id === b) break;
}
if (indexA > indexB) return 1;
if (indexB > indexA) return -1;
return 0;
})
}
},
})
<!-- development version, includes helpful console warnings -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id="app">
<p>
Order:
<textarea v-model="orderString"></textarea>
</p>
<p>
NewArray:
<textarea v-model="newArrayString"></textarea>
</p>
<p>
Result:
{{ result }}
</p>
</div>