繁体   English   中英

根据现有对象字段将数据推送到(嵌套的)数组

[英]Pushing data to (nested) array, depending on existing object field

我将一些数据推送到forEach循环内的数组中:

let result = [];
data.forEach(function(part){
    let text = part.one + part.two;
    result.push({ 
        text: text, 
        element: [{ id: part._id, page: part.page }]
    });
});

但是我需要检查text是否已经在数组的任何对象中。

如果存在这样的对象,则仅应将page part.page添加到具有相同文本字段的该对象的数组中。 否则,数据应仅添加到结果数组中。

result = [
    {
        text: 'Some text',
        element: [{ id: 1, page: '12-34'}]
    }
]

如果下part -elements看起来像这样:

{ id: 2, one: 'Some ', two: 'text', page: '45-67' }
{ id: 3, one: 'Another  ', two: 'text', page: '12-34' }

result应该得到

result = [
    {
        text: 'Some text',
        pages: [{ id: 1, page: '12-34'}, { id: 2, page: '45-67' }] // page added to the array, as text is identical
    },
    {
        text: 'Another text',
        pages: [{ id: 3, page: '12-34'}]
    }
]

附加问题

是否可以首先通过text -field对结果数组进行排序,然后通过page -field对元素对象进行排序?

对于第一个对象,这将是错误的顺序:

[{ id: 2, page: '45-67'}, { id: 1, page: '12-34' }]

...和“A诺特尔文”应该是之前 OME文本“

您可以使用find检查该元素是否存在。 在您的情况下,我将使用findIndex来更新嵌套数组:

let index = result.findIndex(x => x.reference === reference);

if (index === -1) {
    result.push({ 
        text: text,
        element: [
            { 
                id: part._id, 
                page: part.page 
            }
        ]
    });
}
else {
    result[index].element.push(
        { 
            id: part._id, 
            page: part.page 
        }
    );
}

您可以使用如下查找对象:

result = [];
lut = {};
data.forEach(function(part){
    text = part.one + part.two;
    if (lut[text]){
        lut[text].element.push({ id: part._id, page: part.page });
    }else{
        lut[text]={ 
            text: text, 
            element: [{ id: part._id, page: part.page }]
        }
        result.push(lut[text]);
    }
});

在所有元素上使用完排序功能后,它将比较器功能作为参数,您可以在其中指定要用于排序的内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM