我正在将一些数据推送到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'之前
答案 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函数时,它会将比较器函数作为参数,您可以在其中指定要用于排序的内容