这是什么代码?

时间:2015-07-14 23:39:48

标签: javascript arrays

给出两个数组如下:

var searchResultsArray = [{"username": "abc", "userid": 23213}, {"username": "def", "userid": 45646}, {"username": "ghi", "userid": 9898}…..]; // size is 100

var connectionsResultsArray = [{"username": "abc", "userid": 23213}, {"username": "xyz", "userid": 7868}, {"username": "ghi", "userid": 9898}…..]; // size is 300

增强第一个数组(searchResultsArray)以获得一个标志,例如connected,如果元素存在于第二个数组中则设置为“yes”,否则设置为“no”。

从上面输出的样本:

var connectedSearchResultsArray = [{"username": "abc", "userid": 23213, "connected": "yes"}, {"username": "def", "userid": 45646,  "connected": "no"}, {"username": "ghi", "userid": 9898, , "connected": "yes"}…..]; // size is 100

2 个答案:

答案 0 :(得分:4)

您可以简单地遍历第一个数组,然后在该迭代中迭代第二个数组以进行比较。但那将是O(n ^ 2),这根本不是理想的。

相反,您可以将第二个数组存储在哈希表中,然后迭代第一个数组一次,并查明其键是否存在于哈希中。如果是,那么你可以这样追加它。这给出了O(n)时间复杂度,这比我上面提到的蛮力方法要好得多。

答案 1 :(得分:0)

快速执行此操作的方法是在第二个(connectionsResultsArray)中创建项目字典,以便查找时间快(O(1)),然后迭代第一个数组({ {1}})并检查匹配项:

searchResultsArray

这样,您的运行时就是var searchResultsArray = [{"username": "abc", "userid": 23213}, {"username": "def", "userid": 45646}, {"username": "ghi", "userid": 9898}]; var connectionsResultsArray = [{"username": "abc", "userid": 23213}, {"username": "xyz", "userid": 7868}, {"username": "ghi", "userid": 9898}]; // I'm assuming userid is sufficient to determine uniqueness var useridToConnectionsResultMap = {}; for (var i = 0; i < connectionsResultsArray.length; i++) { var connectionsResult = connectionsResultsArray[i]; useridToConnectionsResultMap[connectionsResult.userid] = connectionsResult; } for (var i = 0; i < searchResultsArray.length; i++) { var searchResult = searchResultsArray[i]; searchResult.connected = useridToConnectionsResultMap[searchResult.userid] ? 'yes' : 'no'; } ,其中O(n+m)n是数组中的项目数。

您在对原始问题的评论中提到的解决方案将具有更大的最坏情况运行时间(O(m),因为您可能会遍历完整的第二个数组中的每个项目第一个数组(如果没有匹配项)。当你处理大型集合时(或者只是一般情况下,因为这是一个不好的习惯),这很重要。