簡體   English   中英

如何從對象數組返回匹配的屬性值

[英]how to return matched property value from array of object

我有下面的數組,

var abc = [
 {name: 'name1', id: '1', value: 1},
 {name: 'name2', id: '2', value: 3},
 {name: 'name3', id: '3', value: 2},
 {name: 'name4', id: '4', value: 2}
];

我想回來,

var abc = [
 {name: 'name3', id: '3', value: 2},
 {name: 'name4', id: '4', value: 2}
];

因為兩個對象的值相同。 我如何使用lodash或javascript實現此目的。

您可以創建一個對象,其值將是一個數組,該數組僅包含值相同的那些對象

 var abc = [{ name: 'name1', id: '1', value: 1 }, { name: 'name2', id: '2', value: 3 }, { name: 'name3', id: '3', value: 2 }, { name: 'name4', id: '4', value: 2 } ]; let m = abc.reduce(function(acc, curr) { if (!acc.hasOwnProperty(curr.value)) { acc[curr.value] = []; } acc[curr.value].push(curr) return acc; }, {}) Object.keys(m).forEach(function(item) { if (m[item].length > 1) { console.log(m[item]) } }) 

使用filterfindIndex

 var abc = [ {name: 'name1', id: '1', value: 1}, {name: 'name2', id: '2', value: 3}, {name: 'name3', id: '3', value: 2}, {name: 'name4', id: '4', value: 2} ]; const res = abc.filter(obj => { return abc.findIndex(obj2 => obj2.id !== obj.id && obj2.value === obj.value) > -1; }); console.log(res); 

您可以使用Array.reduce來實現此目標,其復雜度為O(n)

您可以使用鍵作為對象的value屬性來創建object/map 對於數組中的每個對象,檢查對象中的值。 如果值不存在,則將其添加到地圖。 如果值存在( 重復 ),則將對象與存儲在map中的值一起添加到數組。 您將需要重置map中的值,以免最終添加第一個值不止一次。

 var abc = [{name: 'name1', id: '1', value: 1},{name: 'name2', id: '2', value: 3},{name: 'name3', id: '3', value: 2},{name: 'name4', id: '4', value: 2}]; var obj = {}; var result = abc.reduce((a,c) => { if(obj[c.value]) { if(obj[c.value] !== true) { a.push(obj[c.value]); obj[c.value] = true; } a.push(c); } else obj[c.value] = c; return a; }, []); console.log(result); 

您可以使用Array.prototype.reduce()將它們按value字段分組

這樣做的方法如下:

 var abc = [ {name: 'name1', id: '1', value: 1}, {name: 'name2', id: '2', value: 3}, {name: 'name3', id: '3', value: 2}, {name: 'name4', id: '4', value: 2} ]; var reduced = abc.reduce((accumulated, current) => { if(!accumulated[current.value]) { accumulated[current.value] = []; } accumulated[current.value].push(current); return accumulated }, {}) // var value = 1 var value = 2; console.log(reduced[value]) 

只需更改value字段即可獲取所需的數組。

有趣的是,您張貼了一個lodash標簽,但沒有一個lodash答案。

我想添加一個,因為它更簡潔,只需使用.countBy .filter

 var data = [ {name: 'name1', id: '1', value: 1}, {name: 'name2', id: '2', value: 3}, {name: 'name3', id: '3', value: 2}, {name: 'name4', id: '4', value: 2} ]; var result = _.filter(data, ({value}) => _.countBy(data, 'value')[value] > 1) console.log(result) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script> 

暫無
暫無

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

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