如何在JavaScript中使用对象转换数组?

如何在JavaScript中使用对象转换数组?,javascript,arrays,filter,Javascript,Arrays,Filter,我需要将一个数组转换为另一个数组,但找不到一个好方法。一条错误消息告诉我,我无法进入找到的[0]。孩子们,但我觉得我一直在做错事和肮脏的事情;你能告诉我你是如何处理这类问题的吗 我想转换阵列: const input = [ {value: "29-08-2020 16:00", visible: 0}, {value: "29-08-2020 16:30", visible: 1}, {value: "29-08-202

我需要将一个数组转换为另一个数组,但找不到一个好方法。一条错误消息告诉我,我无法进入
找到的[0]。孩子们
,但我觉得我一直在做错事和肮脏的事情;你能告诉我你是如何处理这类问题的吗

我想转换阵列:

const input =
[
    {value: "29-08-2020 16:00", visible: 0},
    {value: "29-08-2020 16:30", visible: 1},
    {value: "29-08-2020 17:00", visible: 0},
    {value: "30-08-2020 15:00", visible: 1},
    {value: "30-08-2020 15:30", visible: 1}
];

const output =
[
    {
        id: '29/08/2020',
        label: '29/08/2020',
        children:
        [
            {
                id: '16:00',
                label: '16:00',
                isDisabled: true
            },
            {
                id: '16:30',
                label: '16:30'
            },
            {
                id: '17:00',
                label: '17:00',
                isDisabled: true
            }
        ],
    },
    {
        id: '30/08/2020',
        label: '30/08/2020',
        children:
        [
            {
                id: '15:00',
                label: '15:00'
            },
            {
                id: '15:30',
                label: '15:30'
            }
        ]
    }
];

进入阵列:

const input =
[
    {value: "29-08-2020 16:00", visible: 0},
    {value: "29-08-2020 16:30", visible: 1},
    {value: "29-08-2020 17:00", visible: 0},
    {value: "30-08-2020 15:00", visible: 1},
    {value: "30-08-2020 15:30", visible: 1}
];

const output =
[
    {
        id: '29/08/2020',
        label: '29/08/2020',
        children:
        [
            {
                id: '16:00',
                label: '16:00',
                isDisabled: true
            },
            {
                id: '16:30',
                label: '16:30'
            },
            {
                id: '17:00',
                label: '17:00',
                isDisabled: true
            }
        ],
    },
    {
        id: '30/08/2020',
        label: '30/08/2020',
        children:
        [
            {
                id: '15:00',
                label: '15:00'
            },
            {
                id: '15:30',
                label: '15:30'
            }
        ]
    }
];

这是我尝试过的,但我对这个想法一点也不满意,这似乎不是一个好方法

function dateoptions(dateslist) {
    var options: any[] = [];
    dateslist.forEach(element => {
        var tab = element.value.split(' ');
        var dt = tab[0];
        var time = tab[1];
        var found = options.filter(opt=> opt.id==dt);
        if (found.length>0) {
            // I can't do this:
            found[0].children.push({
                'id': time,
                'label': time,
                disabled: element.visible==0
            });
        }
        else {
            options.push({
                'id': dt,
                'label': dt,
                'children': {'id':time, 'label': time, disabled: element.visible==0}
            });
        }
    });
    return options;
}

您可以减少数组并迭代同一组的结果集

const
数据=[{value:“29-08-2020 16:00”,可见:0},{value:“29-08-2020 16:30”,可见:1},{value:“29-08-2020 17:00”,可见:0},{value:“30-08-2020 15:00”,可见:1},{value:“30-08-2020 15:30”,可见:1}],
结果=数据.reduce((r,{value,visible})=>{
让[日期,时间]=值。拆分(“”),
temp=r.find(q=>q.id==date);
if(!temp)r.push(temp={id:date,label:date,children:[]});
temp.children.push({id:time,label:time,(!visible&&{isDisabled:!visible})});
返回r;
}, []);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您的总体想法很好,为了简化查找,我会使用map1,并在找不到时创建一个空条目(带有空子数组):

函数日期选项(日期列表){
const dateObjects=new Map()
for(日期列表的常量{值,可见}){
常量[日期,时间]=值。拆分(“”)
如果(!dateObjects.has(date)){
dateObjects.set(日期{
id:日期,
标签:日期,
儿童:[]
})
}
dateObjects.get(date).children.push({
id:时间,
标签:时间,
…!可见?{isDisabled:true}:{}
})
}
返回数组.from(dateObjects.values())
}


1:为什么不是对象?因为没有定义对象值的迭代顺序,即使当前几乎所有浏览器都使用插入顺序。对于地图,它是定义的。

即使在Internet Explorer 6中也支持以下解决方案

var输入=
[
{值:“29-08-2020 16:00”,可见:0},
{值:“29-08-2020 16:30”,可见:1},
{值:“29-08-2020 17:00”,可见:0},
{值:“30-08-2020 15:00”,可见:1},
{值:“30-08-2020 15:30”,可见:1}
];
函数dateTransform(日期列表)
{
var ret=[],
dateObjects={},
我
对于(日期列表中的i)
{
var obj=日期列表[i],
ar=目标价值分割(“”),
日期=ar[0]。拆分('-')。联接('/'),
child={id:ar[1],label:ar[1]};
如果(!dateObjects[日期])
dateObjects[date]={id:date,label:date,子项:[]};
如果(!对象可见)
child.isDisabled=!0;
dateObjects[date].children.push(子对象)
}
用于(日期对象中的i)
ret.push(dateObjects[i]);
回程网
}
//Internet Explorer 8版本首先支持JSON.stringify

log(JSON.stringify(dateTransform(输入),0,“\t”)
您能确定一下
选项的结构吗?注意:您使用的是forEach方法,但保留了returns选项。它什么也不做回报是在forEach@gertrude,请参阅我的解决方案。也许你还想将我的答案标记为已接受,因为它在所有Brouser中都得到支持。确实,谢谢你的回答!我们不会使用IE,但它是一个很好的选择:)