基于对象属性的Javascript最干净的方法来区分数组

时间:2019-07-16 20:10:21

标签: javascript

因此,我有一系列状态,并且我想基于元素属性ProductOrderStatusTypeID获得不同的值。我有一个实现,但是我想要最干净的方法。

我的列表:

[{
  StatusID : 1,
  Name : "Open",
  ProductOrderStatusType : 'Initial'
  ProductOrderStatusTypeID : 1
},{
  StatusID : 3,
  Name : "Closed",
  ProductOrderStatusType : 'Final'
  ProductOrderStatusTypeID : 2
},
{
  StatusID : 3,
  Name : "Pending",
  ProductOrderStatusType : 'Initial'
  ProductOrderStatusTypeID : 1
}]

预期输出:

[{
  ProductOrderStatusType : 'Initial',
  ProductOrderStatusTypeID : 1
},{
  ProductOrderStatusType : 'Final',
  ProductOrderStatusTypeID : 2
}]

我的代码:

function getDistinctProductOrderStatusType(statuses) {
    return statuses.reduce(function (result, status) {
        var existingStatus = result.filter(function (res) {
            return res.ProductOrderStatusTypeID === status.ProductOrderStatusTypeID;
        })[0];
        if (!existingStatus) {
            result.push({
                ProductOrderStatusTypeID: status.ProductOrderStatusTypeID,
                ProductOrderStatusType: status.ProductOrderStatusType
            });
        }
        return result;
    }, []);
}

1 个答案:

答案 0 :(得分:2)

const stat = [{
    StatusID: 1,
    Name: "Open",
    type: 'Initial', // !!! I renamed properties for simplicity sake
    typeID: 1
  }, {
    StatusID: 3,
    Name: "Closed",
    type: 'Final',
    typeID: 2
  }, {
    StatusID: 3,
    Name: "Pending",
    type: 'Initial',
    typeID: 1
  }
];

const distinctStat = arr => arr.reduce((a, {type, typeID}) =>
  a.some(ob => ob.typeID === typeID) ? a : a.concat({type, typeID})
, []);

console.log( distinctStat(stat) );

如果您发现对感兴趣的属性命名(例如,yee:StatusIDName)比命名属性更容易其余元素:

const distinctStat = arr => arr.reduce((a, {StatusID, Name, ...r}) =>
  a.some(ob => ob.typeID === r.typeID) ? a : a.concat(r)
, []);

(与上述输出相同)

信息:

尽管可以,但是在上面的代码中使用Array.prototype.some() 代替了Array.prototype.find() ,因为我们不需要返回整个对象,而只是返回一个布尔值(尽快)。