如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?

Posted

技术标签:

【中文标题】如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?【英文标题】:How to get list with of property from array of objects unless it contains another item with certain value? 【发布时间】:2022-01-22 00:09:42 【问题描述】:

我有一个对象数组,我需要从该对象数组中获取具有某些属性的列表。但我需要该列表仅包含对象包含具有特定元素的另一个属性的那些值。 这很令人困惑,所以我举了一个例子。 假设我有一个包含对象的数组。

  employees = [
           
            n: 'case 1',
            date: '2021-05-4',
            id: '123',
            user: [name: 'Vlad', id: '1', name: 'Misha', id: '2'],
            isPresent : true,
           ,
           
            caseName: 'case 2',
            date: '2021-05-4',
            id: '124',
            user: [name: 'Alina', id: '3', name: 'Alex', id: '4'],
            isPresent : true,
           ,
           
            caseName: 'case 3',
            date: '2021-05-4',
            id: '126',
            user: [],
            isPresent : false,
           ,
        ]

我的任务是从对象数组中获取IDs 的列表,但我只需要从具有isPresenttrue 的对象中获取ID。 所以我需要 ['123', '124']。

我可以使用循环和条件等等。但我想知道是否可以用一条线做?像这样的:

employees.filter(item =>  return item.isPresent === true ))

但我只需要 IDs 而不是整个对象。

【问题讨论】:

但是你只有一个ID为126的对象,其isPresenttrue... 感谢您的关注,我现在编辑一下 答案已编辑。看看 【参考方案1】:

1) 您可以过滤条件为item.isPresent === true 的元素,然后对其进行映射以得到最终结果:

employees
  .filter((item) => item.isPresent === true)
  .map((o) => o.id);

或者你也可以这样做:

employees.filter((item) => item.isPresent).map((o) => o.id)

const employees = [
    n: 'case 1',
    date: '2021-05-4',
    id: '123',
    user: [
      name: 'Vlad',
      id: '1'
    , 
      name: 'Misha',
      id: '2'
    ],
    isPresent: true,
  ,
  
    caseName: 'case 2',
    date: '2021-05-4',
    id: '124',
    user: [
      name: 'Alina',
      id: '3'
    , 
      name: 'Alex',
      id: '4'
    ],
    isPresent: true,
  ,
  
    caseName: 'case 3',
    date: '2021-05-4',
    id: '126',
    user: [],
    isPresent: false,
  ,
]

const result = employees
  .filter((item) => item.isPresent === true)
  .map((o) => o.id);
console.log(result);

2) 您也可以使用reduce 获得相同的结果:

employees.reduce((acc, curr) => 
  curr.isPresent && acc.push(curr.id);
  return acc;
, []);

const employees = [
  
    n: "case 1",
    date: "2021-05-4",
    id: "123",
    user: [
       name: "Vlad", id: "1" ,
       name: "Misha", id: "2" ,
    ],
    isPresent: true,
  ,
  
    caseName: "case 2",
    date: "2021-05-4",
    id: "124",
    user: [
       name: "Alina", id: "3" ,
       name: "Alex", id: "4" ,
    ],
    isPresent: true,
  ,
  
    caseName: "case 3",
    date: "2021-05-4",
    id: "126",
    user: [],
    isPresent: false,
  ,
];

const result = employees.reduce((acc, curr) => 
  curr.isPresent && acc.push(curr.id);
  return acc;
, []);
console.log(result);

【讨论】:

【参考方案2】:

你可以使用这样的东西

employees.filter((item) => item.isPresent).map((obj) => obj.id);

【讨论】:

以上是关于如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 从列表/数组中的每个对象获取单个属性的最简单方法?

如何将具有相同属性的所有字典从数组中获取到新数组?

如何将具有元素数组的每个对象的对象列表转换为具有子元素作为属性的对象数组

从具有对象属性之一的对象列表中获取索引

LINQ:获取包含具有特定名称和值的属性的数组中的对象

如何检查包含另一个对象数组的对象数组是不是具有属性