访问对象中的对象的键和值

时间:2017-04-21 16:52:23

标签: javascript arrays object

我一直在寻找一段时间,似乎找不到我面临的问题的答案。我是新人,所以我很有可能只是在做我错误做的事情。我正在做的目的只是为了学习我能做什么,能用对象,数组和循环做什么,以便我按照我想做的事情完成这个项目,我就是这样做的。慢慢弄清楚如何做这些事情。

所以我这里有一堆对象(带键和值)。我将这些单独的(角色)对象存储到另一个名为Characters的对象中。

function Character(sociability, assertiveness, adventurous, emotionalExpressiveness, kindness,  altruism, affection, trust, impulseControl, thoughtfullness, emotionalStability, sexuality, evil, intellectualCuriosity, novelty, interests, intelligence) {
    "use strict";
    this.sociability = sociability;
    this.assertiveness = assertiveness;
    this.adventurous = adventurous;
    this.emotionalExpressiveness = emotionalExpressiveness;
    this.kindness = kindness;
    this.altruism = altruism;
    this.affection = affection;
    this.trust = trust;
    this.impulseControl = impulseControl;
    this.thoughtfullness = thoughtfullness;
    this.emotionalStability = emotionalStability;
    this.sexuality = sexuality;
    this.evil = evil;
    this.intellectualCuriosity = intellectualCuriosity;
    this.novelty = novelty;
    this.interests = interests;
    this.intelligence = intelligence;
}

var aloy = new Character(0, 11, 11, 0,  11, 11, 0,  0,  0,  0,  0,  0,  0,  10, 0,  0,  0),
    bayonetta = new Character(0, 10, 0, 0,  0,  0,  0,  0,  0,  0,  13, 14, 17, 0,  11, 0,  0),
    elizabeth = new Character(0, 0, 0,  0,  11, 0,  0,  0,  0,  0,  0,  0,  0,  12, 12, 12, 12),
    ellie = new Character(0, 12, 0, 10, 0,  0,  0,  0,  0,  0,  0,  0,  0,  10, 0,  11, 10),

//store all above objects into new object
var Users = {
    aloy: aloy,
    bayonetta: bayonetta,
    elizabeth: elizabeth,
    ellie: ellie,
};

在此之后,我创建一个数组,其中包含Character对象中5个键的名称:

var matchArr = ["sociability", "assertiveness", "adventurous", "emotionalExpressiveness", "kindness"]

这是我所坚持的部分,我会尽力解释它。我会首先向您展示代码,然后尝试理解我想要做的事情。

for (i = 0; i <= 4; i++) {
    for (var obj in Users) {
        if (Users.obj.matchArr[0] > 1) {
            console.log(obj)
        }
    }
}

我想要做的是遍历Users对象,如果该对象中的一个对象(Characters)有一个值满足if语句的键,记录该Character对象的名称。

- 如果我记录for (var obj in Users) { console.log(obj); },我会循环浏览Character中存储在Users中的每个matchArr[0]名称。

- 如果我按其"sociability"列出{我从matchArr数组获得Users.aloy.sociability

- 如果我记录0,我会按预期得到aloy.sociability因为Characters.aloy.matchArr[0]

的值

- 但如果我记录sociability我收到错误(无法读取属性&#39; 0&#39; of undefined)。我不明白为什么这与明确键入matchArr[0]不同,因为这是Users.aloy.sociability的确切值。

如何以我尝试的方式正确引用Users.obj.matchArr[0]。在我的脑海中,有意义的是,当我引用Users.aloy.sociability时,它与显式键入matchArr[0] > "sociability",Users.bayonetta.sociability`(等等循环)相同。

同样,我可能会发现这完全错误,即使它只是指向我可以阅读的其他文档并获得更好的理解,我可能会感激任何帮助。正确的方向。

我唯一的猜测是数组值(例如Public class A_DTO { public string Id {get; set;} public string Name {get; set;} } Public class A_Nav_DTO: A_DTO { public ICollection<B> Bs {get; set;} } )是一个字符串,我不能这样使用字符串。如果是这样,我不知道该怎么办。

提前感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

此循环应该打印字符名称以及字符匹配的属性。

for (var key in Users) {
  matchArr.forEach(function(el) {
    if (Users[key][el] > 1) {
      console.log(key + ' matches attribute of ' + el);
    }
  });
}

工作code example on jsfiddle

答案 1 :(得分:0)

让我们看看:

//loop each Users

for(character in Users) {
  //Loop each matchArr
  matchArr.forEach(function(skill) {
    //at this point we are testing something like this:
    //If Users['aloy']['sociability'] > 1      
    if(Users[character][skill] > 1) {
      //log aloy
      console.log(character);
    }
  }
}