循环使用对象获取唯一名称会产生奇怪的行为

时间:2018-03-25 08:37:00

标签: javascript

我正在尝试从这个用户的示例对象输出唯一的语言名称:

var users = [
  {
    username: 'Alex',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'C++'],
  },
  {
    username: 'Bob',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'PHP'],
  },
  {
    username: 'Mia',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'JavaScript', 'JavaScript'],
  },
  {
    username: 'David',
    favoriteLanguages: ['C#', 'C++', 'JavaScript'],
  },
  {
    username: 'Lee',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'Swift'],
  }
];

我确实通过这样做输出了唯一的语言名称:

var users = [
  {
    username: 'Alex',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'C++'],
  },
  {
    username: 'Bob',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'PHP'],
  },
  {
    username: 'Mia',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'JavaScript', 'JavaScript'],
  },
  {
    username: 'David',
    favoriteLanguages: ['C#', 'C++', 'JavaScript'],
  },
  {
    username: 'Lee',
    favoriteLanguages: ['JavaScript', 'JavaScript', 'Swift'],
  }
];

function allLanguages() {
    var temp = {} // changed
    var final = []
    users.forEach(function(val){
        for(var i in val["favoriteLanguages"]){
            var l = val["favoriteLanguages"]
            if(typeof(temp[l[i]]) == "undefined"){
                final.push(l[i])
            }
            temp[l[i]] = 0
            console.log(temp)
        }
    })
    //console.log("temp: " + temp)
    //console.log("final: " + final)
}

allLanguages();

但是,我不明白为什么我会立即在temp中获得完整的语言对象,从迭代0开始......它开始从控制台输出到:

[JavaScript: 0]
C#
:
0
C++
:
0
JavaScript
:
0
PHP
:
0
Swift
:
0

而且我真的不明白,不应该一个一个地输出,所以每个[l[i]]说出来,而不是所有这些都是马上......我实际上不明白现在我如何能够在final中输出正确的结果。

非常感谢您理解这一点。

1 个答案:

答案 0 :(得分:0)

在检查此属性是否存在以及是否为数组之后,您可以使用对象作为哈希表来收集语言并使用另一个html作为单个用户的语言。

在回调内部使用语言为属性分配forEach,最后获取哈希表的键并返回所有语言。



true