微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有键值条件的Javascript数组排序唯一对象

如何解决具有键值条件的Javascript数组排序唯一对象

我有一个数组

"datawithisNew": [
        {
            "exam_name": "MPSC","isNew": false
        },{
            "exam_name": "MPSC","isNew": true
        },{
            "exam_name": "UPSC",{
            "exam_name": "RAILWAY","isNew": false
        }]

我正在尝试获得具有唯一exam_name的结果,以使得如果exam_name具有至少1个exam_name键,则对象的结果数组也具有唯一isNew值如果为true,则结果对象应具有isNew true属性,如果不是false。 预期结果-

"datawithisNew": [
        {
            "exam_name": "MPSC","isNew": false
        }]

我正在使用的代码是-

 var helper1 = {};
    var result2 = data12.reduce(function(r,o) {
    var key = o.exam_name ;
    
    if(!helper1[key]) {
      helper1[key] = Object.assign({},o); // create a copy of o
      r.push(helper1[key]);
    } else {
      helper1[key].exam_name_rating += o.exam_name_rating;
    }
    return r;
  },[]);

但这只是返回唯一的exam_name对象,如果isNew至少出现一次true一次,它也应该有exam_name,但我也需要isNew:true键为真,否则为isNew:false

解决方法

使用JS Array.filter过滤出重复项

const datawithisNew = [{
    "exam_name": "MPSC","isNew": false
  },{
    "exam_name": "MPSC","isNew": true
  },{
    "exam_name": "UPSC",{
    "exam_name": "RAILWAY","isNew": false
  }
];

const uniqueItems = datawithisNew.filter((exam,index,self) => {
  return self.findIndex(e => exam.exam_name === e.exam_name) === index
}).map(exam => {
  if (!exam.isNew && datawithisNew.find(e => e.exam_name === exam.exam_name && e.isNew)) {
    exam.isNew = true;
  }
  return exam;

});



console.log(uniqueItems);

,

使用您的datawithisNew作为参数调用以下函数

     function getUniqueExams(data){
let finalObjMap = { };
for(var i=0;i<data.length;i++){
let currentObj = data[i];
if(finalObjMap[currentObj["exam_name"]])
{
if(!finalObjMap[currentObj["isNew"]] && currentObj["isNew"])
    finalObjMap[currentObj["exam_name"]]["isNew"]=true;
}
else
{
    finalObjMap[currentObj["exam_name"]]={"isNew":currentObj["isNew"]};
}

}
let finalData=[];
Object.keys(finalObjMap).forEach((key)=>{
let tempExamObj  = { "exam_name": key,"isNew": finalObjMap[key]["isNew"]};
finalData.push(tempExamObj);

});
return finalData;
};

    var datawithisNew=[
            {
                "exam_name": "MPSC","isNew": false
            },{
                "exam_name": "MPSC","isNew": true
            },{
                "exam_name": "UPSC",{
                "exam_name": "RAILWAY","isNew": false
            }];
    console.log(getUniqueExams(datawithisNew));
,

您离实际解决方案不远,在下面添加以下行即可解决您的问题:

helper1[key].isNew ||= o.isNew;
如果当前值不正确,

||=将为值分配一个变量或属性。

如果由于logical OR assignment||=)是一个相当新的赋值运算符而不能使用它,则可以使用:

if (!helper1[key].isNew) helper1[key].isNew = o.isNew;

const data12 = [
  { "exam_name": "MPSC","isNew": false },{ "exam_name": "MPSC","isNew": true  },{ "exam_name": "UPSC",{ "exam_name": "RAILWAY",];

var helper1 = {};
var result2 = data12.reduce(function(r,o) {
  var key = o.exam_name ;

  if(!helper1[key]) {
    helper1[key] = Object.assign({},o); // create a copy of o
    r.push(helper1[key]);
  } else {
    helper1[key].exam_name_rating += o.exam_name_rating;
    helper1[key].isNew ||= o.isNew; // <- added this line
  }
  return r;
},[]);

console.log(result2);

由于示例数据不包含exam_name_rating属性,因此结果将丢失或设置为NaN。我认为此属性在您自己的数据中可用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。