如何遍历包含对象对象的数组

时间:2017-10-03 12:57:10

标签: javascript

这是我的阵列:

[{
    name: "Test",
    skills: {
        agile: true,
        good: true
    }
 },
 {
    name: "Test 2",
    skills: {
        agile: false,
        good: false
    }
 }]

我需要找到技能设置为true的最后一个元素(他的索引)。我知道解决这个问题的唯一方法是使用for / if组合。还有其他更快/最佳的方法吗?

5 个答案:

答案 0 :(得分:2)

使用过滤器:

const goodSkills = myArray.filter(x => x.skills.good)

然后得到最后一项:

goodSkills[goodSkills.length - 1]

或者如果您只需要索引,我们会将name视为唯一键:

const lastGoodIndex = myArray.findIndex(x => x.name === goodSkills[goodSkills.length - 1].name)

然后,您可以将lastGoodIndex用于您想要的任何恶意目的。

或者,如果name不是唯一键,我建议您使用forEach

let lastGoodIndex;
myArray.forEach((x, i) => lastGoodIndex = x.skills.good ? i : lastGoodIndex);
console.log(lastGoodIndex);

答案 1 :(得分:1)

最快的方法是给我们一个for循环:

var arr = [{
    name: "Test",
    skills: {
        agile: true,
        good: true
    }
 },
 {
    name: "Test 2",
    skills: {
        agile: false,
        good: false
    },
 }]
 
function findLastGoodIndex(arr) {
  for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i].skills.good) {
      return i;
    }
  }
 }

console.log(findLastGoodIndex(arr));

如果列表不是很大,您可以将reversefindIndex合并:

arr.reverse().findIndex(x => x.skills.good));

答案 2 :(得分:0)

你可以分三行进行:



var arr = [
  {
    name: "Test",
    skills: {
      agile: true,
      good: true
    }
  },
  {
    name: "Test 2",
    skills: {
      agile: false,
      good: false
    },
  }
]
 
var lastIndex;
arr.forEach(function(item, i) {
  if(item.skills.good) lastIndex = i;
})

console.log(lastIndex);




答案 3 :(得分:0)

如果你想要index最后一个元素good = true的最佳选择是使用for/if(可能会倒退,即i--,如果你能猜到哪里可以你期望good项?)。

filter也会找到项目,它也有index属性,但通常比/ if慢。

forEach通常也会慢于for/if

编辑:造型

答案 4 :(得分:0)

由于您需要搜索最后一个值,因此您应该按降序搜索。这样可以防止任何不必要的迭代。

var data = [{
    name: "Test",
    skills: {
      agile: true,
      good: true
    }
  },
  {
    name: "Test 2",
    skills: {
      agile: false,
      good: false
    }
  }
];

var i = data.length;
var result = null;
while (i--) {
  if (data[i].skills.good) {
    result = i;
    break;
  }
}


console.log(result);