簡體   English   中英

從對象數組中提取對象

[英]Extract object from object array

我需要將一個對象數組拆分為兩個變量。 第一個變量( 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)

是否有可能提取主要對象而不是找到它?

您可以采用單循環方法和相同命名數組的對象,並檢查屬性是否存在in運算符中

 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; } 

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

這不起作用,因為find只返回一個對象(第一個找到),而不是所有與條件不匹配的對象。 你必須使用過濾器

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

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

我會這樣做有點不同。 通過謂詞對列表進行分區的概念值得提取。 所以我可能這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM