我需要将一个对象数组拆分为两个变量。第一个变量(main
)应该使用title
获取对象。
第二个(content
)应该获得所有其他对象。
示例数据
[
{ _id: '1', title: 'Main' },
{ _id: '2', foo: 'bar' },
{ _id: '2', foo: 'bar' }
]
我用find()
/ filter()
命令做到了,但是真的有必要找两次?
const main = data.find(doc => doc.title)
const content = data.filter(doc => !doc.title)
是否可以提取主要对象而不是找到它?
答案 0 :(得分:2)
您可以采用单循环方法和相同命名数组的对象,并检查该属性是否与in
operator一起存在。
var data = [{ _id: '1', title: 'Main' }, { _id: '2', foo: 'bar' }, { _id: '2', foo: 'bar' }],
main = [],
content = [],
temp = { main, content };
data.forEach(doc => temp['title' in doc ? 'main' : 'content'].push(doc));
console.log(main);
console.log(content);

.as-console-wrapper { max-height: 100% !important; top: 0; }

只有一个带标题的对象,您可以直接分配对象并收集数组中的其他对象。
var data = [{ _id: '1', title: 'Main' }, { _id: '2', foo: 'bar' }, { _id: '2', foo: 'bar' }],
main,
content = [];
data.forEach(doc => 'title' in doc
? main = doc
: content.push(doc)
);
console.log(main);
console.log(content);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
const content = data.find(doc => !doc.title)
这不起作用,因为find
仅返回一个对象(找到的第一个对象),而不是所有不符合条件的对象。您必须使用过滤器
const content = data.filter(doc => !doc.title)
所以是的,你必须迭代两次,一次找到匹配的对象,第二次构建一个排除匹配对象的数组。
答案 2 :(得分:0)
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]);
}
答案 3 :(得分:0)
我会这样做有点不同。通过谓词对列表进行分区的概念值得提取。所以我可能会这样做:
const docs = [{_id: '1', title: 'Main'},{_id: '2', foo: 'bar'},{_id: '2', foo: 'bar'}]
const partition = pred => data => data.reduce(
([matches, mismatches], item) => pred(item)
? [matches.concat(item), mismatches]
: [matches, mismatches.concat(item)],
[[], []]
)
const withTitle = partition(doc => 'title' in doc)
console.log(withTitle(docs))
.as-console-wrapper { max-height: 100% !important; top: 0; }
当然,withTitle
很可能应该被内联,如果没有被重用的话。也可能是我输入的currying,我通常的默认值,对你来说不是必需的,它应该是(pred, data) => data.reduce(...)