如何根据条件获取唯一项
How to get the unique items based on condition
我有一个 Javascript 片段来仅存储对象数组中的唯一项,如下所示:-
const array = [
{id: 3, name: 'Central Microscopy', fiscalYear: 2018},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
{id: 3, name: 'Central Microscopy', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
{id: 3, name: 'Central Microscopy', fiscalYear: 2019},
];
const result = [];
const map = new Map();
for (const item of array) {
if (!map.has(item.id) ) {
map.set(item.id, true); // set any value to Map
result.push({
id: item.id,
name: item.name,
fiscalYear: item.fiscalYear
});
}
}
console.log(result);
这个结果是
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 }
]
现在我想要拥有独特的项目,并且拥有那些会计年度大于现有项目的项目。
例如:-
对于相同的输入,输出应为:- 我需要 javascript 或打字稿(语言约束)
中的代码
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2019},
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 }
]
即使数据很大也需要一个最优解
let array = [
{id: 3, name: 'Central Microscopy', fiscalYear: 2018},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
{id: 3, name: 'Central Microscopy', fiscalYear: 2027},
{id: 3, name: 'Central Microscopy', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
{id: 3, name: 'Central Microscopy', fiscalYear: 2019},
{id: 3, name: 'Central Microscopy', fiscalYear: 2021},
];
let temp = array.filter((elem) => elem.fiscalYear >= 2018)
let cache = {}
temp.forEach((elem) => {
if(cache[elem.name]){
if(cache[elem.name].fiscalYear < elem.fiscalYear){
cache[elem.name] = elem;
}
}
else{
cache[elem.name] = elem;
}
})
let result = Object.values(cache);
console.log(result);
你只需要在循环中再添加一个过滤器,
let bigYear = item.fiscalYear
let filteredItem = array.filter((e=>e.id===item.id && e.fiscalYear > bigYear))[0]
result.push(filteredItem ? {...filteredItem} : item);
最终版 片段看起来很像,
const array = [
{id: 3, name: 'Central Microscopy', fiscalYear: 2018},
{id: 3, name: 'Central Microscopy', fiscalYear: 2029},
{id: 3, name: 'Central Microscopy', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
];
const result = [];
const map = new Map();
for (const item of array) {
if (!map.has(item.id) ) {
map.set(item.id, true); // set any value to Map
let bigYear = item.fiscalYear
let filteredItem = array.filter((e=>e.id===item.id && e.fiscalYear > bigYear))[0]
result.push(filteredItem ? {...filteredItem} : item);
}
}
console.log(result);
我有一个 Javascript 片段来仅存储对象数组中的唯一项,如下所示:-
const array = [
{id: 3, name: 'Central Microscopy', fiscalYear: 2018},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
{id: 3, name: 'Central Microscopy', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
{id: 3, name: 'Central Microscopy', fiscalYear: 2019},
];
const result = [];
const map = new Map();
for (const item of array) {
if (!map.has(item.id) ) {
map.set(item.id, true); // set any value to Map
result.push({
id: item.id,
name: item.name,
fiscalYear: item.fiscalYear
});
}
}
console.log(result);
这个结果是
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 }
]
现在我想要拥有独特的项目,并且拥有那些会计年度大于现有项目的项目。 例如:- 对于相同的输入,输出应为:- 我需要 javascript 或打字稿(语言约束)
中的代码[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2019},
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 }
]
即使数据很大也需要一个最优解
let array = [
{id: 3, name: 'Central Microscopy', fiscalYear: 2018},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
{id: 3, name: 'Central Microscopy', fiscalYear: 2027},
{id: 3, name: 'Central Microscopy', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
{id: 3, name: 'Central Microscopy', fiscalYear: 2019},
{id: 3, name: 'Central Microscopy', fiscalYear: 2021},
];
let temp = array.filter((elem) => elem.fiscalYear >= 2018)
let cache = {}
temp.forEach((elem) => {
if(cache[elem.name]){
if(cache[elem.name].fiscalYear < elem.fiscalYear){
cache[elem.name] = elem;
}
}
else{
cache[elem.name] = elem;
}
})
let result = Object.values(cache);
console.log(result);
你只需要在循环中再添加一个过滤器,
let bigYear = item.fiscalYear
let filteredItem = array.filter((e=>e.id===item.id && e.fiscalYear > bigYear))[0]
result.push(filteredItem ? {...filteredItem} : item);
最终版 片段看起来很像,
const array = [
{id: 3, name: 'Central Microscopy', fiscalYear: 2018},
{id: 3, name: 'Central Microscopy', fiscalYear: 2029},
{id: 3, name: 'Central Microscopy', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
{id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
];
const result = [];
const map = new Map();
for (const item of array) {
if (!map.has(item.id) ) {
map.set(item.id, true); // set any value to Map
let bigYear = item.fiscalYear
let filteredItem = array.filter((e=>e.id===item.id && e.fiscalYear > bigYear))[0]
result.push(filteredItem ? {...filteredItem} : item);
}
}
console.log(result);