假设我有以下内容:

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)

当前回答

@travis-j的forEach版本的答案(对现代浏览器和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

和一个通用的解决方案,需要一个mapper函数(略慢于直接映射,但这是预期的):

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]

其他回答

如果你被ES5卡住了,或者由于某种原因不能使用new Set或new Map,并且你需要一个包含具有唯一键的值的数组(而不仅仅是唯一键的数组),你可以使用以下方法:

function distinctBy(key, array) {
    var keys = array.map(function (value) { return value[key]; });
    return array.filter(function (value, index) { return keys.indexOf(value[key]) === index; });
}

或者是TypeScript中的类型安全等效:

public distinctBy<T>(key: keyof T, array: T[]) {
    const keys = array.map(value => value[key]);
    return array.filter((value, index) => keys.indexOf(value[key]) === index);
}

用法:

var distinctPeople = distinctBy('age', people);

所有其他的答案:

返回唯一键的数组而不是对象(就像返回年龄列表而不是有唯一年龄的人); 使用ES6, new Set, new Map等可能无法提供给你; 没有可配置的键(比如将.age硬编码到不同的函数中); 假设键可以用于索引数组,但这并不总是正确的,TypeScript不允许这样做。

这个答案没有以上四个问题中的任何一个。

让移动= [{id: 1、品牌:“B1”},{id: 2、品牌:“B2”},{id: 3、品牌:“B1”},{id: 4、品牌:“B1”},{id: 5、品牌:“B2”},{id: 6、品牌:“B3”}] let allBrandsArr = mobilePhones .map(row=>{ 返回row.brand; }); let uniqueBrands = allBrandsArr。filter((item, index, array) => (array . indexof (item) === index)); console.log('uniqueBrands ', uniqueBrands);

回答这个老问题是毫无意义的,但是有一个简单的答案说明了Javascript的本质。Javascript中的对象本质上是哈希表。我们可以使用它来获得唯一键的哈希值:

var o = {}; array.map(function(v){ o[v.age] = 1; });

然后我们可以将哈希化简为一个唯一值的数组:

var a2 = []; for (k in o){ a2.push(k); }

这就是你所需要的。数组a2只包含唯一的年龄。

我对这个函数的看法是:

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 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]。