2017-08-04 148 views
1

我有这样的,我是从外部端点得到一个对象,因此不能改变:JavaScript的 - 遍历对象

let obj = { 
    0: { "time": 1, "day": 1, }, 
    1: { "time": 2, "day": 1, }, 
    2: { "time": 3, "day": 1, }, 
    3: { "time": 1, "day": 2, }, 
    4: { "time": 2, "day": 2, }, 
    5: { "time": 3, "day": 2, } 
} 

我需要得到它变成像一个格式:

1: { 
    1: { "time": 1, "day": 1 }, 
    2: { "time": 2, "day": 1 }, 
    3: { "time": 3, "day": 1 }, 
}, 
2: { 
    1: { "time": 1, "day": 2 }, 
    2: { "time": 2, "day": 2 }, 
    3: { "time": 3, "day": 2 }, 
} 

在哪里第一个关键是一天,第二个是时间。

我尝试不起作用

let obj = { 
 
    0: { "time": 1, "day": 1, }, 
 
    1: { "time": 2, "day": 1, }, 
 
    2: { "time": 3, "day": 1, }, 
 
    3: { "time": 1, "day": 2, }, 
 
    4: { "time": 2, "day": 2, }, 
 
    5: { "time": 3, "day": 2, } 
 
} 
 

 
let test = {} 
 

 
let defaultRow = { 
 
    1: {}, 
 
    2: {} 
 
} 
 

 
Object.keys(obj).forEach((key) => { 
 
    if (!test[obj[key]["day"]]) {test[obj[key]["day"]] = defaultRow} 
 
    test[obj[key]["day"]][obj[key]["time"]] = obj[key]         
 
}) 
 

 
console.log(test)

这两天包含相同的数据由于某种原因。我怎样才能做到这一点?任何帮助表示赞赏!

+0

问题寻求帮助调试(“**为什么不是这个代码工作?**“)必须包括所需的行为,*特定的问题或错误*和*必要的最短代码*来重现我t **在问题本身**。没有**明确问题陈述**的问题对其他读者没有用处。请参阅:[如何创建最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 – Andreas

+0

所以你想分割你的数据来显示父项中的每三个项目,这是正确的吗? – codtex

+0

你应该看看reduce函数:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce。这有点复杂,但是你会发现很多资源用“reduce keyword”寻找其他的stackoverflow – HollyPony

回答

0

转换成使用Object#values对象的阵列,并使用Array#reduce转换为所需的格式迭代阵列。

const obj = {"0":{"time":1,"day":1},"1":{"time":2,"day":1},"2":{"time":3,"day":1},"3":{"time":1,"day":2},"4":{"time":2,"day":2},"5":{"time":3,"day":2}}; 
 

 
const result = Object.values(obj).reduce((r, o) => { 
 
    r[o.day] = Object.assign(r[o.day] || {}, { [o.time]: o }); 
 
    
 
    return r; 
 
}, {}); 
 

 
console.log(result);

0

还有就是先从:

const result = Object.values(obj).reduce((accumulator, currentValue) => { 
    if (!accumulator[currentValue.day]) accumulator[currentValue.day] = [] 
    accumulator[currentValue.day].push(currentValue) 
    return accumulator 
}, {}) 
console.log(result) 

这不是解决办法,但一开始套件:)

更多的相关信息: - MDN reduce - Stackoverflow search

0

既然你想让你的嵌套对象是普通对象而不是数组解决方案来获得最后一个索引是相当复杂的。

let obj = { 
 
    0: { "time": 1, "day": 1, }, 
 
    1: { "time": 2, "day": 1, }, 
 
    2: { "time": 3, "day": 1, }, 
 
    3: { "time": 1, "day": 2, }, 
 
    4: { "time": 2, "day": 2, }, 
 
    5: { "time": 3, "day": 2, } 
 
} 
 

 

 
console.log(
 
    Object.values(obj).reduce(
 
    (acc, value) => { 
 
     const holder = acc[value.day] || (acc[value.day] = { }) 
 
     const keys = Object.keys(holder).map(key => +key) 
 
     
 
     holder[keys.length ? (Math.max(...keys) + 1) : 1] = value 
 
     return acc 
 
    }, 
 
    {} 
 
) 
 
)

2

这两天包含相同的数据由于某种原因

因为你分配相同的对象引用defaultRow到每一行。一个简单的修正是转defaultRow成每次

let obj = { 
 
    0: { "time": 1, "day": 1, }, 
 
    1: { "time": 2, "day": 1, }, 
 
    2: { "time": 3, "day": 1, }, 
 
    3: { "time": 1, "day": 2, }, 
 
    4: { "time": 2, "day": 2, }, 
 
    5: { "time": 3, "day": 2, } 
 
} 
 

 
let test = {} 
 

 
let defaultRow = function() { 
 
    return { 
 
    1: {}, 
 
    2: {} 
 
    } 
 
} 
 

 
Object.keys(obj).forEach((key) => { 
 
    if (!test[obj[key]["day"]]) { 
 
    test[obj[key]["day"]] = defaultRow(); 
 
    } 
 
    test[obj[key]["day"]][obj[key]["time"]] = obj[key] 
 
}) 
 

 
console.log(test)

问题的简单例子

var obj ={a:1}, 
    foo = obj, 
    bar = obj; 

foo.a=2; 
console.log(bar.a) //returns 2 because is same object as foo 
+0

您对每天数据为何相同的解释非常有帮助,谢谢!但我已经接受了另一个答案,因为我认为解决方案有点干净 – sharif9876

+0

当然..我可以做到这一点不同。常常更好地理解为什么存在这个问题,而不是写一个完全不同的代码来掩盖原始问题 – charlietfl

0

为了解决这个问题,你需要遍历返回一个新对象的函数通过你的对象,并valueday作为你的外部和增量inner key根据对象中你可以ge t通过Object.keys.length

以下是示例代码。

let obj = { 
 
    0: { 
 
    "time": 1, 
 
    "day": 1, 
 
    }, 
 
    1: { 
 
    "time": 2, 
 
    "day": 1, 
 
    }, 
 
    2: { 
 
    "time": 3, 
 
    "day": 1, 
 
    }, 
 
    3: { 
 
    "time": 1, 
 
    "day": 2, 
 
    }, 
 
    4: { 
 
    "time": 2, 
 
    "day": 2, 
 
    }, 
 
    5: { 
 
    "time": 3, 
 
    "day": 2, 
 
    } 
 
} 
 

 
let newObj = {}; 
 

 
for (let key in obj) { 
 
    if(typeof newObj[obj[key]["day"]] !== "object") { 
 
    newObj[obj[key]["day"]] = {}; 
 
    } 
 
    let index = Object.keys(newObj[obj[key]["day"]]).length + 1; 
 
    newObj[obj[key]["day"]][index] = obj[key]; 
 
} 
 

 
console.log(newObj);

1

你可以采取的对象,并建立一个新的对象具有新的结构。

var object = { 0: { time: 1, day: 1 }, 1: { time: 2, day: 1 }, 2: { time: 3, day: 1 }, 3: { time: 1, day: 2 }, 4: { time: 2, day: 2 }, 5: { time: 3, day: 2 } }, 
 
    result = Object.values(object).reduce(
 
     (r, o) => ((r[o.day] = r[o.day] || {})[o.time] = o, r), 
 
     {} 
 
    ); 
 

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

0

这会为你工作

var result = Object.values(obj).reduce((count, currentValue) => { 
    count[currentValue.day] = count[currentValue.day] || {}; 
    count[currentValue.day][Object.keys(count[currentValue.day]).length + 1] = currentValue; 
    return count 
}, {}); 
0
// your code goes here 
let obj = { 
    0: { "time": 1, "day": 1, }, 
    1: { "time": 2, "day": 1, }, 
    2: { "time": 3, "day": 1, }, 
    3: { "time": 1, "day": 2, }, 
    4: { "time": 2, "day": 2, }, 
    5: { "time": 3, "day": 2, } 
} 

obj = Object.values(obj).reduce(function(newObject, val){ 
    //console.log(val.day, val.time, newObject); 
    if(newObject[val['day']] == undefined) 
     newObject[val['day']] ={}; 
    newObject[val['day']][val['time']] = val; 
    //console.log(val.day, val.time, newObject); 
    return newObject; 
},{}) 

console.log(obj); 
    /* 
output 
{ '1': 
    { '1': { time: 1, day: 1 }, 
    '2': { time: 2, day: 1 }, 
    '3': { time: 3, day: 1 } }, 
    '2': 
    { '1': { time: 1, day: 2 }, 
    '2': { time: 2, day: 2 }, 
    '3': { time: 3, day: 2 } } } 
*/ 
0

我真的不知道为什么你需要的属性1对象,...,N,而不是仅仅使用用于此目的的阵列。我想解决这个问题是这样的:

let obj = { 
 
    0: { "time": 1, "day": 1, }, 
 
    1: { "time": 2, "day": 1, }, 
 
    2: { "time": 3, "day": 1, }, 
 
    3: { "time": 1, "day": 2, }, 
 
    4: { "time": 2, "day": 2, }, 
 
    5: { "time": 3, "day": 2, } 
 
}; 
 

 
function orderByDay(obj){ 
 
    const result = {}; 
 
    Object.keys(obj).forEach(function(key){ 
 
     let day = obj[key].day; 
 
     if(result.hasOwnProperty(day)){ 
 
      result[day].push(obj[key]); 
 
     }else{ 
 
      result[day] = [obj[key]]; 
 
     } 
 
    }); 
 
    return result; 
 
} 
 

 
console.log(orderByDay(obj));

-1

我相当可读的版本

let obj = { 
 
    0: { "time": 1, "day": 1, }, 
 
    1: { "time": 2, "day": 1, }, 
 
    2: { "time": 3, "day": 1, }, 
 
    3: { "time": 1, "day": 2, }, 
 
    4: { "time": 2, "day": 2, }, 
 
    5: { "time": 3, "day": 2, } 
 
} 
 

 
let test = {} 
 

 
for (let o in obj) { 
 
    const day = obj[o].day; 
 
    const time = obj[o].time; 
 
    if (test[day]==undefined) { 
 
    test[day] = {} 
 
    } 
 
    test[day][time] = {day:day,time:time} 
 
} 
 

 
console.log(test)

+0

Donvoter解释了什么?它的工作原理是可以理解的 – mplungjan