为了账号安全,请及时绑定邮箱和手机立即绑定

迭代数组并在任何匹配项和额外提供的属性值处收集特定数据

迭代数组并在任何匹配项和额外提供的属性值处收集特定数据

三国纷争 2022-12-29 16:03:06
我有一个看起来像这样的数据结构:var data2 = {  "name" : "history",  "list": [{    "type" : "a",    "max" : 52.346377,    "min" : 0.1354055,    "date": "17-01-01",    "time": "21:38:17"  }, {    "type" : "b",    "max" : 55.3467377,    "min" : 0.1154055,    "date": "17-01-01",    "time": "22:38:17"  }, {    "type" : "b",    "max" : 48.3467377,    "min" : -0.1354055,    "date": "17-01-01",    "time": "23:38:17"  }]}我希望能够迭代此数据的list属性并检查列表项的type值是否与另一个提供的值匹配。如果是这样,我想收集max和min值。如何完成这项任务?我不知道如何解决这个问题。
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

“......我想要特定类型值的所有最大值和最小值,而不是绝对最大值和绝对最小值。有什么办法可以包括这个吗?”

可能最自然/最明显的方法是首先filter提供匹配的任何列表项type......

data2.list.filter(item => item.type === typeToCheckFor)

...并在第二步中map过滤数组的任何项目...

.map(item => { min: item.min, max: item.max });

另一种方法是reduce在一个迭代周期内得到结果......

var data2 = {

  "name" : "history",

  "list": [{

    "type" : "a",

    "max" : 52.346377,

    "min" : 0.1354055,

    "date": "17-01-01",

    "time": "21:38:17"

  }, {

    "type" : "b",

    "max" : 55.3467377,

    "min" : 0.1154055,

    "date": "17-01-01",

    "time": "22:38:17"

  }, {

    "type" : "b",

    "max" : 48.3467377,

    "min" : -0.1354055,

    "date": "17-01-01",

    "time": "23:38:17"

  }]

}



function collectMinMaxValuesOfMatchingType(collector, item) {

  if (item.type === collector.type) {


    collector.list.push({

    //type: item.type,

      min: item.min,

      max: item.max

    })

  }

  return collector;

}



console.log(

  data2.list.reduce(collectMinMaxValuesOfMatchingType, {

    type: 'b',

    list: []

  }).list

);

console.log(

  data2.list.reduce(collectMinMaxValuesOfMatchingType, {

    type: 'a',

    list: []

  }).list

);


console.log(

  data2.list.reduce(collectMinMaxValuesOfMatchingType, {

    type: 'foo',

    list: []

  }).list

);

.as-console-wrapper { min-height: 100%!important; top: 0; }


查看完整回答
反对 回复 2022-12-29
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

在 data.list 上使用过滤器将只传递那些类型与搜索值相同的对象。然后使用 map 创建具有最小/最大值的新对象。


function filterArray(array, value) {

   let result = array.list.filter( obj => obj.type===value).map( filtered => {

       return {max: filtered.max, min: filtered.min}

   });

   return result;

}


var data2 = {

  "name" : "history",

  "list": [

  {

      "type" : "a",

      "max" : 52.346377,

      "min" : 0.1354055,

      "date": "17-01-01",

      "time": "21:38:17"

    },

    {

      "type" : "b",

      "max" : 55.3467377,

      "min" : 0.1154055,

      "date": "17-01-01",

      "time": "22:38:17"

    },

    {

      "type" : "b",

      "max" : 48.3467377,

      "min" : -0.1354055,

      "date": "17-01-01",

      "time": "23:38:17"

    }

  ]

}


console.log(filterArray(data2,'b'));

console.log(filterArray(data2,'a'));

console.log(filterArray(data2,'any'));


查看完整回答
反对 回复 2022-12-29
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

例如,您可以使用一个简单的for ... of循环;


let checkType = "a";

let max, min;


for (let entry of data2.list) {

   if (entry.type === checkType) {

      max = entry.max;

      min = entry.min;

      break;

   }

}


console.log(min, max);

现在让我们注意这将在第一次出现正确的“类型”时停止(如果您有多个相同类型的条目);


如果你想考虑相同“类型”的多个条目,你可以结合 afilter和map迭代,例如:


let checkType = "b";

let minMaxValues = data2.list

                   .filter(e => e.type === checkType)

                   .map(e => { min : e.min, max : e.max });


console.log(minMaxValues);

/*

[{

  min : 0.1154055,

  max : 55.3467377

},

{

  min : -0.1354055,

  max : 48.3467377

}] */


查看完整回答
反对 回复 2022-12-29
  • 3 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信