https://bigfrontend.dev/problem/improve-a-function
// Given an input of array,
// which is made of items with >= 3 properties
let items = [
{color: 'red', type: 'tv', age: 18},
{color: 'silver', type: 'phone', age: 20},
{color: 'blue', type: 'book', age: 17}
]
// an exclude array made of key value pair
const excludes = [
{k: 'color', v: 'silver'},
{k: 'type', v: 'tv'},
...
]
function excludeItems(items, excludes) {
excludes.forEach( pair => {
items = items.filter(item => item[pair.k] === item[pair.v])
})
return items
}- What does this function
excludeItemsdo? - Is this function working as expected ?
- What is the time complexity of this function?
- How would you optimize it ?
note
we only judge by the result, not the time cost. please submit the best approach you can.
Answers to the questions:
- The function
excludeItemsreturns items that match the conditions inexcludesarray. - No. Because the function is called
excludesItems, it should exclude items that match the conditions. - O(n * m)
- We should also handle duplicate keys in
excludesarray.
/**
* @param {object[]} items
* @param { Array< {k: string, v: any} >} excludes
* @return {object[]}
*/
function excludeItems(items, excludes) {
const excludesMap = new Map();
for (const { k, v } of excludes) {
if (!excludesMap.has(k)) {
excludesMap.set(k, new Set());
}
excludesMap.get(k).add(v);
}
return items.filter((item) =>
Object.keys(item).every(
// Time complexity of V8's Set.has() is practically O(1).
(key) => !excludesMap.has(key) || !excludesMap.get(key).has(item[key])
)
);