查找具有回退条件的数组对象



我需要在数组中找到一个对象,方法如下:

  • 获取第一个有效对象
  • 如果没有有效的对象,返回最大版本的对象

对象接口:

interface Data {
version: number;
valid: boolean;
}

样本数据:

const data = [{version: 1, valid: false}, {version: 2, valid: false}, {version: 3, valid: false}];
// return {version: 3, valid: false} because there is no valid object and the greatest version is 3

const data2 = [{version: 1, valid: false}, {version: 2, valid: true}, {version: 3, valid: true}];
// return {version: 2, valid: true} because this is the first valid object

如果我对数组进行过滤,它只适用于第二个样本,因为我不能再次循环数组以获得最大的版本:

data.find(d => d.valid); // undefined
data2.find(d => d.valid); // {version: 2, valid: true}

游乐场:

const data = [{version: 1, valid: false}, {version: 2, valid: false}, {version: 3, valid: false}];
const data2 = [{version: 1, valid: false}, {version: 2, valid: true}, {version: 3, valid: true}];

console.log(data.find(d => d.valid));
console.log(data2.find(d => d.valid));

您可以按照您的标准排序并返回第一个对象:

result = [...data].sort((a, b) => a.valid - b.valid || a.version - b.version).pop()

如果你担心这样"效率低下",你也可以使用像这样的简单循环

function find(data) {
let maxVer = data[0]

for (let d of data) {
if (d.valid)
return d
if (d.version > maxVer.version)
maxVer = d
}

return maxVer
}

您可以像这样检查Array.prototype.find()是否存在有效对象,Array.prototype.reduce()是否存在最大版本:

const data = [{version: 1, valid: false}, {version: 2, valid: false}, {version: 3, valid: false}];
// return {version: 3, valid: false} because there is no valid object and the greatest version is 3

const data2 = [{version: 1, valid: false}, {version: 2, valid: true}, {version: 3, valid: true}];
// return {version: 2, valid: true} because this is the first valid object
function findFirstValidOrGreatestVersion(data) {
return data.find(({ valid }) => valid) || data.reduce((acc, cur) => acc.version < cur.version ? cur : acc);
}
console.log(findFirstValidOrGreatestVersion(data));
console.log(findFirstValidOrGreatestVersion(data2));

如果你关闭一个变量,比如maxObject,它跟踪你的最大对象,你可以运行.find(),同时在数组的一次传递中找到最大对象:

const data = [{version: 1, valid: false}, {version: 2, valid: false}, {version: 3, valid: false}];
const data2 = [{version: 1, valid: false}, {version: 2, valid: true}, {version: 3, valid: true}];
const getObj = data => {
let maxObj = {version: -Infinity};
const res = data.find((data) => {
maxObj = data.version > maxObj.version ? data : maxObj; 
return data.valid;
});
return res || maxObj;
}; 
console.log(getObj(data));
console.log(getObj(data2));

如果需要查找具有O(n)的对象,则尝试遍历数组并使用reduce方法检查条件:

const data = [{version: 1, valid: false}, {version: 2, valid: false}, {version: 3, valid: false}];
const anObject = data.reduce((a, {version, valid})=> {
if (Object.keys(a).length == 0) {
a[version] = {version, valid};
return a;
}
let acc_key = Object.keys(a)[0] ;
if (a[acc_key].valid) return a;
if (version > acc_key) {
delete a[acc_key];
a[version] = {version, valid};
}
return a;
},{});
console.log(Object.values(anObject));

和另一种情况:

const data2 = [{version: 1, valid: false}, {version: 2, valid: true}, {version: 3, valid: true}];
const anObject = data2.reduce((a, {version, valid})=> {
if (Object.keys(a).length == 0) {
a[version] = {version, valid};
return a;
}
let acc_key = Object.keys(a)[0] ;
if (a[acc_key].valid) return a;
if (version > acc_key) {
delete a[acc_key];
a[version] = {version, valid};
}
return a;
},{});
console.log(Object.values(anObject));

最新更新