Speed up comparison of items with huge numbers of tags
Can cause a freeze while syncing items with 1000s of tags
This commit is contained in:
parent
b7f26c47c1
commit
a10fcfd58e
2 changed files with 12 additions and 5 deletions
|
@ -505,11 +505,16 @@ Zotero.DataObjectUtilities = {
|
||||||
},
|
},
|
||||||
|
|
||||||
_tagsDiff: function (data1, data2 = []) {
|
_tagsDiff: function (data1, data2 = []) {
|
||||||
|
var equals = Zotero.Tags.equals.bind(Zotero.Tags);
|
||||||
|
|
||||||
|
var cleanedData1 = data1.map(x => Zotero.Tags.cleanData(x));
|
||||||
|
var cleanedData2 = data2.map(x => Zotero.Tags.cleanData(x));
|
||||||
|
|
||||||
var changeset = [];
|
var changeset = [];
|
||||||
outer:
|
outer:
|
||||||
for (let i = 0; i < data1.length; i++) {
|
for (let i = 0; i < data1.length; i++) {
|
||||||
for (let j = 0; j < data2.length; j++) {
|
for (let j = 0; j < data2.length; j++) {
|
||||||
if (Zotero.Tags.equals(data1[i], data2[j])) {
|
if (equals(cleanedData1[i], cleanedData2[j], { skipClean: true })) {
|
||||||
continue outer;
|
continue outer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -522,7 +527,7 @@ Zotero.DataObjectUtilities = {
|
||||||
outer:
|
outer:
|
||||||
for (let i = 0; i < data2.length; i++) {
|
for (let i = 0; i < data2.length; i++) {
|
||||||
for (let j = 0; j < data1.length; j++) {
|
for (let j = 0; j < data1.length; j++) {
|
||||||
if (Zotero.Tags.equals(data2[i], data1[j])) {
|
if (equals(cleanedData2[i], cleanedData1[j], { skipClean: true })) {
|
||||||
continue outer;
|
continue outer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -944,9 +944,11 @@ Zotero.Tags = new function() {
|
||||||
/**
|
/**
|
||||||
* Compare two API JSON tag objects
|
* Compare two API JSON tag objects
|
||||||
*/
|
*/
|
||||||
this.equals = function (data1, data2) {
|
this.equals = function (data1, data2, options = {}) {
|
||||||
data1 = this.cleanData(data1);
|
if (!options.skipClean) {
|
||||||
data2 = this.cleanData(data2);
|
data1 = this.cleanData(data1);
|
||||||
|
data2 = this.cleanData(data2);
|
||||||
|
}
|
||||||
return data1.tag === data2.tag
|
return data1.tag === data2.tag
|
||||||
&& ((!data1.type && !data2.type) || data1.type === data2.type);
|
&& ((!data1.type && !data2.type) || data1.type === data2.type);
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue