[英]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.