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

时间:2016-07-12 12:55:53

标签: javascript arrays object

我正在将一些数据推送到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是否已经存在于数组的任何对象中。

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

示例

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

如果下一个part - 元素看起来像这样:

{ 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 - 字段对结果数组进行排序,然后按page - 字段对元素对象进行排序?

这对第一个对象来说是错误的顺序:

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

...和' A 其他文字'应该在' S ome text'之前

2 个答案:

答案 0 :(得分:1)

您可以使用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 
        }
    );
}

答案 1 :(得分:-2)

你可以像这样使用查找对象:

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]);
    }
});

当你完成对所有元素使用sort函数时,它会将比较器函数作为参数,您可以在其中指定要用于排序的内容