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,现在更新了数据结构。谢谢你的帮助