array1 = [{id: 1, email: 'test1@test.com', group_ids: ["25"], username: 'test1'},
{id: 2, email: 'test2@test.com', group_ids: ["22"], username: 'test2'},
{id: 3, email: 'test3@test.com', group_ids: ["25", "20"], username: 'test3'},
{id: 4, email: 'test4@test.com', group_ids: ["23"], username: 'test4'}]
array2 = [25, 22];
我想从 array1 获取在 array2 中group_ids的电子邮件列表。我已经尝试了以下方法,但我想我做错了。
var user_groupId = [];
var emails = [];
var obj = [];
for (var i=0; i < array2.length; i++) {
obj.push(array1.find(o => o.group_ids.find( b => b == array2[i])));
}
for (var i=0; i< obj.length; i++){
emails.push(obj[i].email);
}
console.log(emails);
在这里,我得到输出数组["test1@test.com","test2@test.com"],但没有"test3@test.com"。我将不胜感激你的帮助。
你应该使用filter
、map
和some
。 此外,您的 id 在一个位置是字符串也不是好的做法,它们应该具有相同的类型:
array1.filter(item => item.group_ids.some(id => array2.includes(+id))).map(item => item.email)
+id
将 array1 项的字符串转换为 int
我认为你已经把这个问题复杂化了,你应该记住你正在比较不同的数据类型(字符串<=>数字(。有很多方法可以做到这一点,但无论采取什么方法,重要的是要清楚地表达我们的代码试图实现的目标。 请参阅下面的评论和链接,了解我的建议的解释......
var array1 = [{id: 1, email: 'test1@test.com', group_ids: ["25"], username: 'test1'},
{id: 2, email: 'test2@test.com', group_ids: ["22"], username: 'test2'},
{id: 3, email: 'test3@test.com', group_ids: ["25", "20"], username: 'test3'},
{id: 4, email: 'test4@test.com', group_ids: ["23"], username: 'test4'}]
var array2 = [25, 22];
function group_Emails(list_array, id_array) {
var result = [],
email;
/* loop over list_array */
list_array.forEach(obj => {
/* for each item in list_array (obj)
convert group_ids to integers and
store in new list_group_ids array */
var list_group_ids = obj.group_ids.map(num_str => {
return parseInt( num_str, 10 )
});
/* compare id_array to list_group_ids */
id_array.forEach(num => {
/* does list_group_ids contain num? */
list_group_ids.includes( num ) && (
/* if so grab email from obj */
email = obj.email,
/* add email to result if not present
(avoids duplicate entries) */
-1 === result.indexOf( email ) && result.push( obj.email )
);
})
});
return result;
}
console.log( group_Emails(array1, array2) );
// => [ "test1@test.com", "test2@test.com", "test3@test.com" ]
希望有帮助。 :)
- Array.include(( @ MDN
- Array.forEach(( @ MDN