根据嵌套的对象数组过滤对象数组

时间:2018-03-18 17:04:06

标签: javascript ecmascript-6

我有一个数组:

myData: [{
   name: "",
   lastName: "",
   historicalData: [{
    data1: '',
    data2: 0,
   },
    {
    data1: '',
    data2: 30,
   }
  ]
},
{
   name: "",
   lastName: "",
   historicalData: [{
    data1: '',
    data2: 6,
   },
    {
    data1: '',
    data2: 1,
   }
  ]
 }
]

我想迭代这个数组,过滤它以获得data2>的所有数据。 2.然后按data1对结果进行排序。

由于它是对象数组中的嵌套对象数组,因此我不确定如何在es6中进行迭代和过滤。

有什么建议吗?

myData.filter(oneData => historicalData.data1 > 2)

但最初我还要映射历史数据。 预期结果:

myData: [{
  name: "",
  lastName: "",
  historicalData: [{
    data1: '',
    data2: 30,
  }]
},{
  name: "",
  lastName: "",
    historicalData: [{
    data1: '',
    data2: 6,
  }]
}]

一旦我得到了这个结果,我就可以进行相应的排序。 感谢

3 个答案:

答案 0 :(得分:0)

您可以构建新对象并过滤historicalData

此解决方案不会改变原始数据。



var data = [{ name: "", lastName: "", historicalData: [{ data1: '', data2: 0, }, { data1: '', data2: 30, }] }, { name: "", lastName: "", historicalData: [{ data1: '', data2: 6, }, { data1: '', data2: 1, }] }],
    filtered = data.map(o =>
        Object.assign({}, o, { historicalData: o.historicalData.filter(({ data2 }) => data2 > 2) }));

console.log(filtered);

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




答案 1 :(得分:0)

过滤

 myData.map(x => x.historicalData = x.historicalData.filter(x => x.data2 >2))

如果你想排序

myData.map(x => x.historicalData = x.historicalData.filter(x => x.data2 >2).sort((y,z)=> y.data1.localeCompare(z.data1) ))

如果要进行排序和过滤而不进行变异

myData.map( m => { 
  return { 
    ...m , 
    ...{ historicalData: m.historicalData.filter(data  => data.data2 > 2) .sort((y,z)=> y.data1.localeCompare(z.data1))} 
  } 
});

编辑:添加了localeCompare,因为它是进行字符串排序的正确方法。

答案 2 :(得分:0)

var myData = [{
    name: "",
    lastName: "",
    historicalData: [{
        data1: '',
        data2: 0,

    }, {
        data1: '',
        data2: 30,

    }]
}, {
    name: "",
    lastName: "",
    historicalData: [{
        data1: '',
        data2: 6,

    }, {
        data1: '',
        data2: 1,

    }]
}];

var res = myData.map( (a) => {
  a["historicalData"] = a["historicalData"].filter( (aa) => aa["data2"] > 2 );
  return a;
});

// since you were unclear about the historicalData 
// array length and how you choose set to 0
res = res.sort( (a,aa) => a["historicalData"][0].data1 - aa["historicalData"][0].data1 );
console.log(res);