【问题标题】:Loop over objects to get only the unique keys循环对象以仅获取唯一键
【发布时间】:2018-09-02 02:59:49
【问题描述】:

我有一个对象数组:

let array1 = [
  { age: 20, name: "bob" }, 
  { age: 24, name: "Mike" },
  { age: 20, name: "Penny" },
  { age: 24, name: "Jeff" },
  { age: 25, name: "Mary" }
];

试图找到一个 forLoop 或 forEach 的示例,它将遍历对象数组并仅返回我将推送到另一个数组的唯一年龄键 ([20, 24, 25])。

预期结果值为:

[20, 24, 25]

【问题讨论】:

标签: javascript object key


【解决方案1】:

使用 es6 集,这可以在一行中完成。

let res = [...new Set(array1.map(e => e.age))];

解释:

array1.map(e => e.age) 将通过仅返回 .age 值返回原始数组的副本,因此结果将是:[20,24,20,24,25]

new Set(array1.map(e => e.age)) 将从上述数组中创建一个唯一集合,因此它将是一个 Set 实例,它将自动删除重复项

...new Set ...) 会将上述集合转换为数组。相应的结果将是,所以,[20,24,25]

https://jsfiddle.net/6ozdqsuw/2/

【讨论】:

    【解决方案2】:

    如果您希望最终得到一个标准数组,我建议您获取所有年龄实例,然后转换为 Set 并再次返回。

    首先获取年龄键处的条目以获取年龄数组。

    const allAges = originalArray.map(({ age }) => age)
    

    然后从年龄创建一个集合:

    const ageSet = new Set(allAges)
    

    然后转换回你想要的数组:

    const uniqueAges = [...ageSet]
    

    如果你想在一行中:

    const uniqueAges = [...new Set(originalArray.map(({ age }) => age))]
    

    【讨论】:

      【解决方案3】:

      我不知道您所说的“独特”是什么意思 但是,如果你使用过滤器,你可以得到一个只有年龄键的新数组:

      let filtered = array1.map(elem => elem.age)
      

      更多信息here:

      【讨论】:

        【解决方案4】:

        这样的?

        let result = [];
        array1.forEach(e=>{
            if (result.indexOf(e.age) === -1) {
                result.push(e.age)
            }
        })
        

        【讨论】:

        • 非常感谢。有用。我通过推送到两个数组来了解您在做什么。你能解释一下这个函数还是把它写出来?
        • 它遍历原始数组并检查age 属性的值是否存在于result 数组中(如果不存在,它的indexOf() 将返回-1)。如果没有,它会将这个值推送到result
        • 谢谢我不擅长箭头功能。谢谢为什么我想我们能把这个写出来吗?哈哈
        【解决方案5】:

        您的问题正是 ES6 Set 的用途!

        使用Set,您可以添加任何您喜欢的元素,但它们只会添加到集合中,前提是它们尚未在集合中。

        let array1 = [
            {
                name: "bob",
                age: 20,
            }, 
            {
                name: "Mike",
                age: 24,
            },
            {
                name: "Penny",
                age: 20,
            },
            {
                name: "Jeff",
                age: 24,
            },
            {
                name: "Mary",
                age: 25,
            },
        ]
        
        let ages = new Set()
        array1.forEach(user => {
          ages.add(user.age)
        }) 
        
        //ages = Set [ 20, 24, 25 ]

        【讨论】:

          【解决方案6】:

          根据我对问题的理解,这是一个使用内置数组迭代器方法的功能解决方案。 map 返回一个仅包含年龄的数组(即:[20, 24, 20, 24, 25]),filter 删除重复项。

          let array1 = [
              {
                  name: "bob",
                  age: 20,
              }, 
              {
                  name: "Mike",
                  age: 24,
              },
              {
                  name: "Penny",
                  age: 20,
              },
              {
                  name: "Jeff",
                  age: 24,
              },
              {
                  name: "Mary",
                  age: 25,
              },
          ]
          
          console.log(
            array1
              .map(({age}) => age)
              .filter((age, i, arr) => arr.lastIndexOf(age) === i)
          )

          【讨论】:

            猜你喜欢
            • 2015-08-11
            • 2019-06-21
            • 2021-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多