如何将数组中的这些项移动到数组中的对象中?

时间:2017-02-20 14:38:33

标签: javascript jquery arrays

我有一个数组,它包含在冒号的左侧,关卡的名称,而在右侧,它有完成关卡的难度。

我希望能够将它放入数组中的对象中,以便稍后当我需要检查哪些级别已经完成困难时,我可以转到数组中的每个对象进行检查。

以下是我目前的数组:

   var levels = [
      "Level 1 : Easy", 
      "Level 1 : Normal", 
      "Level 1 : Hard", 
      "Level 2 : Easy", 
      "Level 2 : Normal", 
      "Level 3 : Easy", 
      "Level 3 : Hard"];

我怎么能把它放到数组中的对象中,所以它是这样的:

var levelCompletion = [
            {
                name: "Level 1",
                easy: true,
                normal: true,
                hard: true
            },
            {
                name: "Level 2",
                easy: true,
                normal: true,
                hard: false
            },
            {
                name: "Level 3",
                easy: true,
                normal: false,
                hard: true
            }
];

请注意" levelCompletion"数组已存在于我的项目中,但所有难度值都设置为false,因为我无法理解如何将值放在" level"数组进入" levelCompletion"数组正确。

非常感谢

5 个答案:

答案 0 :(得分:2)

您可以从现有levelCompletion生成哈希表,并将其用于levels的迭代。

在内部,将部分中的给定字符串拆分为名称和属性值,检查散列是否不存在,然后生成具有默认属性的新条目,设置为false。然后将给定属性设置为true

var levels = ["Level 1 : Easy", "Level 1 : Normal", "Level 1 : Hard", "Level 2 : Easy", "Level 2 : Normal", "Level 3 : Easy", "Level 3 : Hard"],
    levelCompletion = [],
    hash = Object.create(null);

levelCompletion.forEach(function (o) {
    hash[o.name] = o;
});

levels.forEach(function (a) {
    var parts = a.split(' : ');
    if (!hash[parts[0]]) {
        hash[parts[0]] = { name: parts[0] };
        ['easy', 'normal', 'hard'].forEach(function (k) { hash[parts[0]][k] = false; });
        levelCompletion.push(hash[parts[0]]);
    }
    hash[parts[0]][parts[1].toLowerCase()] = true;
});

console.log(levelCompletion);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

for (var i=0; i<levels.length; i++){
    var items = levels[i].split(' : ');
    var level = items[0];
    var difficulty = items[1].toLowerCase();
    for (var j=0; j<levelCompletion.length; j++){
        if (levelCompletion[j].name === level) {
            levelCompletion[j][difficulty] = true;
            break;
        }
    }
}

不确定你的意思。你可能想写这样的levelCompletion:

var levelCompletion = {
 "Level 1": {

                easy: true,
                normal: true,
                hard: true
            },
 "Level 2": {
                easy: true,
                normal: true,
                hard: false
            }
}

因此,您不需要在每个循环中进行游览。

答案 2 :(得分:1)

&#13;
&#13;
var levels = [
  "Level 1 : Easy",
  "Level 1 : Normal",
  "Level 1 : Hard",
  "Level 2 : Easy",
  "Level 2 : Normal",
  "Level 3 : Easy",
  "Level 3 : Hard"
];

var obj = {},t, i, keys = {};
for (i = 0; i < levels.length; i++) 
{
  t = levels[i].split(":");
  t[0] = t[0].trim();
  t[1] = t[1].trim().toLowerCase();
  keys[t[1]] = 1;

  if (t[0] in obj) 
  {
    obj[t[0]][t[1]] = true;
  } else 
  {
    obj[t[0]] = { name: t[0] };
    obj[t[0]][t[1]] = true;
  }
}

var output = Object.keys(obj).map(function(key) {
  for (i in keys) {
    if (!(i in obj[key])) obj[key][i] = false;
  }
  return obj[key]
});

console.log(output);
&#13;
&#13;
&#13;

答案 3 :(得分:1)

这就是我接近它的方法,其中一些就是我在转换数组时倾向于.map和.reduce。 map 当输出总是与输入具有完全相同数量的元素时, reduce 当它具有更少时,就像这里的情况一样。如果您不熟悉它,基本上它会对每个元素执行一个函数,并且从该函数返回的任何内容都将作为下一个函数调用中的参数提供(我的 newLevels 参数代码),最后一个是整个事物的返回值。我提供给reduce函数的第二个参数是一个空数组(&#34; []&#34;),这样当我的函数在第一个元素上被调用时,newLevels已经是一个初始化数组。

我认为可能有帮助的另一件事是我使数组索引与级别编号基于零的对应,所以当你想要稍后查找时,levelCompletion [level - 1] .easy将获得完成状态level是级别的数字表示(即1)。我的诱惑实际上是让第一个元素未定义为代码可读性,这只是意味着删除&#34; - 1&#34;来自 var levelindex 行。

&#13;
&#13;
cfgElement
&#13;
&#13;
&#13;

答案 4 :(得分:0)

首先,遍历数组中的每个级别。然后,用冒号将其拆分为一个列表。将级别名称和难度放入字典中。

for level in levels:
    sublist=level.split(":")
    levelCompletion[sublist[0]]=[sublist[1]]

字典的键是“子列表”中的第一个元素,值是第二个元素。对不起,我不做Javascript我做python,但我希望这能给你一个大致的想法。我也是一个新手,所以是的。最后,这不会使真值和假值只是难度级别本身,你将不得不使用几个if语句。类似的东西:

if sublist[1]="easy":
    levelCompletion[sublist[0]]="easy: " True