Javascript 从对象数组中提取对象

Javascript 从对象数组中提取对象,javascript,Javascript,我需要将一个对象数组拆分为两个变量。第一个变量(main)应获取具有标题的对象。 第二个(content)应该获取所有其他对象 样本数据 我是用find()/filter()命令完成的,但是真的需要查找两次吗 const main = data.find(doc => doc.title) const content = data.filter(doc => !doc.title) 是否可以提取主对象而不是查找它 const content = data.find(doc =>

我需要将一个对象数组拆分为两个变量。第一个变量(
main
)应获取具有
标题的对象。
第二个(
content
)应该获取所有其他对象

样本数据

我是用
find()
/
filter()
命令完成的,但是真的需要查找两次吗

const main = data.find(doc => doc.title)
const content = data.filter(doc => !doc.title)
是否可以提取主对象而不是查找它

const content = data.find(doc => !doc.title)
这不起作用,因为
find
只返回一个对象(第一个找到的对象),而不是所有与条件不匹配的对象。你必须用一个过滤器

const content = data.filter(doc => !doc.title)

因此,是的,您必须迭代两次,一次查找匹配对象,第二次构建不包含匹配对象的数组。

您可以采用单循环方法,为相同命名数组创建一个对象,并检查属性是否存在

var data=[{u-id:'1',title:'Main'},{u-id:'2',foo:'bar'},{u-id:'2',foo:'bar'}],
main=[],
内容=[],
temp={main,content};
data.forEach(doc=>temp['title'在doc'main':'content'].push(doc));
控制台日志(主);
控制台日志(内容)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
工作小提琴:

我会做一些不同的事情。用谓词划分列表的概念值得一提。所以我可以这样做:

const docs=[{{u id:'1',title:'Main'},{{u id:'2',foo:'bar'},{u id:'2',foo:'bar'}]
const partition=pred=>data=>data.reduce(
([匹配,不匹配],项)=>pred(项)
?[匹配项。concat(项目),不匹配项]
:[匹配,不匹配。concat(项目)],
[[], []]
)
const withTitle=分区(文档=>文档中的“标题”)
console.log(带标题(文档))

.as console wrapper{max height:100%!important;top:0;}
如果我们有两个带有“title”的条目,该怎么办?我不确定“提取主对象而不是查找它”是什么意思。如果“提取”不仅仅是“发现”,它会是什么样子?除此之外,您当前的解决方案似乎已经相当优雅了。我不知道如何才能显著改进。假设你实际上是指第二行的
data.filter
,我认为它没有任何问题。除非您的阵列很大,否则不会有任何性能差异。您当前的解决方案比其他方法更具可读性。lodash
let{false:docs,true:[main]}=.\uu.groupBy(ary,x=>!!x.title)
是否可以将
main
作为对象—因为它通常只有一个对象?@user3142695,是的,这是可能的,以示例二为例。
const content = data.filter(doc => !doc.title)
var docs = [
  { _id: '1', title: 'Main' },
  { _id: '2', foo: 'bar' },
  { _id: '2', foo: 'bar' }
];

var doc = [],main = [];

for(_doc in docs){
    if(typeof docs[_doc].title != 'undefined') {
        doc.push(docs[_doc]);
        continue;
  }

  main.push(docs[_doc]);
}