我有一个带两个列表的函数(两个列表中的每个项目都是相同的类型)。如果第一个列表中不存在第二个列表中的项,则它仅将第二个列表中的项添加到第一个列表。为了确定它是否存在于列表中,我比较属性pk。
addUniqueItemsToList: function (sourceList, toAddList) {
for (var a = 0; a < toAddList.length; a++) {
var doesItemExist = false;
for (var b = 0; b < sourceList.length; b++) {
if (sourceList[b].pk == toAddList[a].pk) {
doesItemExist = true;
break;
}
}
if (!doesItemExist) {
sourceList.push(toAddList[a]);
}
}
}
在javascript中是否存在一种方式,而不是比较pk,我可以通过将属性的名称传递给函数来将它与对象的其他属性进行比较?即addUniqueItemsToList:function(sourceList,toAddList,propertyName)
答案 0 :(得分:1)
是的,您可以直接通过对象属性进行比较,并使用字符串作为关键的ej数组[&#39; mykey&#39;]进行动态访问。另外,如果不是在for(1for -n for)内部创建一个地图以避免这么多迭代,那会更好:
例如:items.length = 100&amp;时没有地图的数字迭代anotherItems.length = 200
100 * 200 = 20000次迭代。
EG。使用items.length = 100&amp;创建地图的迭代次数。 anotherItems.length = 200
300次迭代。
我如何做的例子:
var items = [{_id: 1, text: "Text 1"}, {_id:2, text: "Text 2"}];
var anotherItems = [{_id: 1, text: "Text 1"}];
var mapByProperty = function(array, prop) {
var map = [];
for (var i = 0, len = array.length; i !== len; i++) {
map[array[i][prop]] = array[i];
}
return map;
};
var commonUniqueProperty = '_id';
var mappedAnotherItemsById = mapByProperty(anotherItems, commonUniqueProperty);
for(var i = 0, len = items.length; i !== len; i++) {
if(mappedAnotherItemsById[items[i][commonUniqueProperty]]) {
console.log(items[i]);
}
}