Javascript 如何在不使用三个嵌套for循环的情况下解决此问题

Javascript 如何在不使用三个嵌套for循环的情况下解决此问题,javascript,arrays,object,lodash,Javascript,Arrays,Object,Lodash,我有一个类似这样的对象数组 var data = [{"2017-09-13":{date_time:"2017-09-13",value:"20"}},{"2017-09-13":{date_time:"2017-09-13",value:"22"}},{"2017-09-15":{date_time:"2017-09-15",value:"25"}},{"2017-09-15":{date_time:"2017-09-15",value:"30"}},{"2017-09-16":{date_

我有一个类似这样的对象数组

var data = [{"2017-09-13":{date_time:"2017-09-13",value:"20"}},{"2017-09-13":{date_time:"2017-09-13",value:"22"}},{"2017-09-15":{date_time:"2017-09-15",value:"25"}},{"2017-09-15":{date_time:"2017-09-15",value:"30"}},{"2017-09-16":{date_time:"2017-09-16",value:"10"}}];
var dates = ["2017-09-13","2017-09-15"];
var date = [];
for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < dates.length; j++) {
            for (key in data[i]) {
                if (dates[j] == key) {
                    date.push(data[i])
                }
            }
    }
}
我有一系列这样的日期

var data = [{"2017-09-13":{date_time:"2017-09-13",value:"20"}},{"2017-09-13":{date_time:"2017-09-13",value:"22"}},{"2017-09-15":{date_time:"2017-09-15",value:"25"}},{"2017-09-15":{date_time:"2017-09-15",value:"30"}},{"2017-09-16":{date_time:"2017-09-16",value:"10"}}];
var dates = ["2017-09-13","2017-09-15"];
var date = [];
for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < dates.length; j++) {
            for (key in data[i]) {
                if (dates[j] == key) {
                    date.push(data[i])
                }
            }
    }
}
我想修改数据数组,使其只包含dates数组中提到的日期。我试过这样的东西

var data = [{"2017-09-13":{date_time:"2017-09-13",value:"20"}},{"2017-09-13":{date_time:"2017-09-13",value:"22"}},{"2017-09-15":{date_time:"2017-09-15",value:"25"}},{"2017-09-15":{date_time:"2017-09-15",value:"30"}},{"2017-09-16":{date_time:"2017-09-16",value:"10"}}];
var dates = ["2017-09-13","2017-09-15"];
var date = [];
for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < dates.length; j++) {
            for (key in data[i]) {
                if (dates[j] == key) {
                    date.push(data[i])
                }
            }
    }
}
var日期=[];
对于(变量i=0;i
它给了我所需的结果。但是,这不是有效的,并且滞后于应用程序。有什么有效的方法吗


编辑:更新了正确的数据结构

您的数据结构很糟糕。您将始终需要两个循环来迭代它。但是,我们可以建立一个更优雅的数据结构(也称为地图),我们可以更容易地访问它:

 const days = new Map();

 for(const obj of data){
   for(day in obj){
    if( days.has(day) ){
      days.get(day).push( obj[day] );
    } else {
      days.set(day, [ obj[day] ]);
    }
  }
}
创建地图后,您只需执行以下操作:

days.get("2017-09-13")
获取具有datetime/值的对象数组。可以很容易地进行迭代:

days.get("2017-09-13").forEach( ({value}) => {
  console.log(value);
});
或获得多个日期:

 const result = new Map(
   dates.map(date => [date, days.get( date )] )
 );

 console.log( [...result] );
和仅数据:

const result = [];
dates.forEach(date => result.push(...days.get(date)));

你的数据结构很难看。您将始终需要两个循环来迭代它。但是,我们可以建立一个更优雅的数据结构(也称为地图),我们可以更容易地访问它:

 const days = new Map();

 for(const obj of data){
   for(day in obj){
    if( days.has(day) ){
      days.get(day).push( obj[day] );
    } else {
      days.set(day, [ obj[day] ]);
    }
  }
}
创建地图后,您只需执行以下操作:

days.get("2017-09-13")
获取具有datetime/值的对象数组。可以很容易地进行迭代:

days.get("2017-09-13").forEach( ({value}) => {
  console.log(value);
});
或获得多个日期:

 const result = new Map(
   dates.map(date => [date, days.get( date )] )
 );

 console.log( [...result] );
和仅数据:

const result = [];
dates.forEach(date => result.push(...days.get(date)));
const数据=[
{
"2017-09-13": {
“日期和时间”:“2017-09-13”,
“值”:“20”
}
},
{
"2017-09-13": {
“日期和时间”:“2017-09-13”,
“值”:“22”
}
},
{
"2017-09-15": {
“日期和时间”:“2017-09-15”,
“值”:“25”
}
},
{
"2017-09-15": {
“日期和时间”:“2017-09-15”,
“值”:“30”
}
},
{
"2017-09-16": {
“日期和时间”:“2017-09-16”,
“值”:“10”
}
}
];
施工日期=[“2017-09-13”、“2017-09-15”];
const datesSet=新设置(日期);
const filteredData=data.filter(item=>datesSet.has(Object.keys(item)[0]);
console.log(filteredData)
const数据=[
{
"2017-09-13": {
“日期和时间”:“2017-09-13”,
“值”:“20”
}
},
{
"2017-09-13": {
“日期和时间”:“2017-09-13”,
“值”:“22”
}
},
{
"2017-09-15": {
“日期和时间”:“2017-09-15”,
“值”:“25”
}
},
{
"2017-09-15": {
“日期和时间”:“2017-09-15”,
“值”:“30”
}
},
{
"2017-09-16": {
“日期和时间”:“2017-09-16”,
“值”:“10”
}
}
];
施工日期=[“2017-09-13”、“2017-09-15”];
const datesSet=新设置(日期);
const filteredData=data.filter(item=>datesSet.has(Object.keys(item)[0]);

console.log(filteredData)这里是一个只有两个for循环的解决方案

var数据=[{'2017-09-13':{date_-time:“2017-09-13”,value:“20”},{'2017-09-13':{date_-time:“2017-09-13”,value:“22”},{'2017-09-15':{'date_-time:“2017-09-15”,value:{'2017-09-15':{date date time:“2017-09-15”,value:“30”{'2017-09-16':{date time:“2017-09-09-16”,value:“10};
var日期=[];
对于(变量i=0;i控制台日志(日期)这里是一个只有两个for循环的解决方案

var数据=[{'2017-09-13':{date_-time:“2017-09-13”,value:“20”},{'2017-09-13':{date_-time:“2017-09-13”,value:“22”},{'2017-09-15':{'date_-time:“2017-09-15”,value:{'2017-09-15':{date date time:“2017-09-15”,value:“30”{'2017-09-16':{date time:“2017-09-09-16”,value:“10};
var日期=[];
对于(变量i=0;i
那你就可以了

for (var i in dataByDate) { ... }
那你就可以了

for (var i in dataByDate) { ... }

谢谢,这很有效。就BigO而言,这会有多大的效率?很好。它比O(n)多一点,这取决于
日期的长度。我会让它快一点。我引入了
datesSet
,这是一个哈希映射来克服这个问题。@ideaboxer为什么不
const datesSet=new Set(dates)然后???@编码兄弟这取决于你过滤的频率。第二次之后,为10^5数据建立一个地图可能会更快。谢谢你的帮助。就BigO而言,这会有多大的效率?很好。它比O(n)多一点,这取决于
日期的长度。我会让它快一点。我引入了
datesSet
,这是一个哈希映射来克服这个问题。@ideaboxer为什么不
const datesSet=new Set(dates)然后???@编码兄弟这取决于你过滤的频率。第二次之后,为10^5数据建立映射可能会更快。哎呀,现在更新了数据结构。感谢helpedOops,现在更新了数据结构。谢谢你的帮助