从对象数组中提取对象

时间:2018-01-23 15:17:46

标签: javascript

我需要将一个对象数组拆分为两个变量。第一个变量(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)

是否可以提取主要对象而不是找到它?

4 个答案:

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

工作小提琴: https://jsfiddle.net/andreitodorut/fcLkata6/

答案 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(...)