如何从JavaScript中的对象数组中获取不同的值?javascript


Answers

如果您使用ES6 / ES2015或更高版本,则可以这样做:

var unique = [...new Set(array.map(item => item.age))];

这里是一个如何做到一点的例子。

基于@Jonas Kello编辑建议:

const unique = [...new Set(array.map(item => item.age))];
Question

假设我有以下几点:

var array = 
    [
        {"name":"Joe", "age":17}, 
        {"name":"Bob", "age":17}, 
        {"name":"Carl", "age": 35}
    ]

能够获得所有不同年龄段的数组的最佳方法是什么,以便我得到一个结果数组:

[17, 35]

有没有什么办法可以选择性地构造数据或更好的方法,这样我就不必遍历每个数组,检查“年龄”的值,并检查另一个数组的存在,并添加它,如果不是?

如果有某种方式,我可以不用迭代就把不同的年龄拉出来...

目前我想要改进的方法不够...如果这意味着不是将“数组”作为一个对象数组,而是使用某个唯一键(即“1,2,3”)的对象的“映射”好吧。 我只是寻找最有效的方式。

以下是我目前如何做,但对我来说,迭代似乎只是效率低下,即使它工作...

var distinct = []
for (var i = 0; i < array.length; i++)
   if (array[i].age not in distinct)
      distinct.push(array[i].age)



我只是映射和删除dups:

var ages = array.map(function(obj) { return obj.age; });
ages = ages.filter(function(v,i) { return ages.indexOf(v) == i; });

console.log(ages); //=> [17, 35]

编辑: Aight! 不是性能方面最有效的方式,而是最简单的最易读的IMO。 如果你真的关心微观优化或者你有大量的数据,那么定期for循环会更加“高效”。




forEach版本的@travis-j的答案(对现代浏览器和Node JS世界有帮助):

var unique = {};
var distinct = [];
array.forEach(function (x) {
  if (!unique[x.age]) {
    distinct.push(x.age);
    unique[x.age] = true;
  }
});

Chrome v29.0.1547上的速度提高了34%: http ://jsperf.com/filter-versus-dictionary/3

一个通用的解决方案,需要一个映射函数(稍微比直接映射,但是这是预期的):

function uniqueBy(arr, fn) {
  var unique = {};
  var distinct = [];
  arr.forEach(function (x) {
    var key = fn(x);
    if (!unique[key]) {
      distinct.push(key);
      unique[key] = true;
    }
  });
  return distinct;
}

// usage
uniqueBy(array, function(x){return x.age;}); // outputs [17, 35]



我已经开始在所有新项目中默认使用Underscore,所以我从来不需要考虑这些小小的数据管理问题。

var array = [{"name":"Joe", "age":17}, {"name":"Bob", "age":17}, {"name":"Carl", "age": 35}];
console.log(_.chain(array).map(function(item) { return item.age }).uniq().value());

产生[17, 35] 17,35 [17, 35]




这是如何解决这个问题,从2017年8月25日起使用新的设置通过ES6打字稿

Array.from(new Set(yourArray.map((item: any) => item.id)))



underscore.js _.uniq(_.pluck(array,"age"))




function get_unique_values_from_array_object(array,property){
    var unique = {};
    var distinct = [];
    for( var i in array ){
       if( typeof(unique[array[i][property]]) == "undefined"){
          distinct.push(array[i]);
       }
       unique[array[i][property]] = 0;
    }
    return distinct;
}



如果像我一样,你更喜欢一个更“功能”而不损害速度,这个例子使用快速字典查找包装内减少封闭。

var array = 
[
    {"name":"Joe", "age":17}, 
    {"name":"Bob", "age":17}, 
    {"name":"Carl", "age": 35}
]
var uniqueAges = array.reduce((p,c,i,a) => {
    if(!p[0][c.age]) {
        p[1].push(p[0][c.age] = c.age);
    }
    if(i<a.length-1) {
        return p
    } else {
        return p[1]
    }
}, [{},[]])

根据这个测试,我的解决方案是建议答案的两倍




如果你有Array.prototype.includes或愿意填充它,这工作:

var ages = []; array.forEach(function(x) { if (!ages.includes(x.age)) ages.push(x.age); });



我在这个功能上的两分钱:

var result = [];
for (var len = array.length, i = 0; i < len; ++i) {
  var age = array[i].age;
  if (result.indexOf(age) > -1) continue;
  result.push(age);
}

你可以在这里看到结果(方法8) http://jsperf.com/distinct-values-from-array/3




你试一试

var x = [] ;
for (var i = 0 ; i < array.length ; i++)
{
 if(x.indexOf(array[i]['age']) == -1)
  {
    x.push(array[i]['age']);
  }
}
console.log(x);



unique(obj, prop) {
    let result = [];
    let seen = new Set();

    Object.keys(obj)
        .forEach((key) => {
            let value = obj[key];

            let test = !prop
                ? value
                : value[prop];

            !seen.has(test)
                && seen.add(test)
                && result.push(value);
        });

    return result;
}