【问题标题】:Javascript Array sorting unique object with a key value conditionJavascript数组排序具有键值条件的唯一对象
【发布时间】:2021-02-18 01:34:35
【问题描述】:

我有一个数组

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

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

"datawithisNew": [
        {
            "exam_name": "MPSC",
            "isNew": true
        },

        {
            "exam_name": "UPSC",
            "isNew": false
        },
        {
            "exam_name": "RAILWAY",
            "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

【问题讨论】:

  • 请分享您的代码,以及您在尝试解决它时遇到的问题

标签: javascript arrays sorting object javascript-objects


【解决方案1】:

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

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",    "isNew": false },
  { "exam_name": "RAILWAY", "isNew": false },
  { "exam_name": "RAILWAY", "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;
    helper1[key].isNew ||= o.isNew; // <- added this line
  }
  return r;
}, []);

console.log(result2);

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

【讨论】:

  • 是的,我的数据中也提供了该属性,您使我更容易添加到我正在使用的代码中。感谢这帮助
  • 查看browser compatibility 以查看当前支持此运算符的引擎。目前 Internet Explorer、Opera、Samsung Internet 和 Node.JS 不支持它。如果这是一个问题,请选择替代解决方案。如果您使用像Babel 这样的转译器,则不必担心兼容性问题。
  • 操作员没有工作,因为我使用的是 nodejs,但替代解决方案对我有用
【解决方案2】:

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

const datawithisNew = [{
    "exam_name": "MPSC",
    "isNew": false
  },

  {
    "exam_name": "MPSC",
    "isNew": true
  },
  {
    "exam_name": "UPSC",
    "isNew": false
  },

  {
    "exam_name": "RAILWAY",
    "isNew": false
  },
  {
    "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);

【讨论】:

  • 它适用于唯一的exam_name键我还需要第二个键isNew,如果它至少存在一次真值,否则为假
  • @pse 立即运行,它会为您提供唯一的键,并且如果任何考试将 isNew 设置为 true,它还会将其设置为 true
【解决方案3】:

使用 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",
                "isNew": false
            },
          
            {
                "exam_name": "RAILWAY",
                "isNew": false
            },
            {
                "exam_name": "RAILWAY",
                "isNew": false
            }];
    console.log(getUniqueExams(datawithisNew));

【讨论】:

  • 如果我们交换对象的索引,它会失败一个测试用例,例如:当第 0 位在第 1 位和第 1 位时
  • 您是对的,编辑了帖子,请立即尝试。感谢您的更正:)
  • 这段代码也有效,但很抱歉我会接受另一个,因为它是几行代码,对我有用。但谢谢你的时间
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
相关资源
最近更新 更多