使用JavaScript

时间:2017-10-09 11:50:06

标签: javascript

我有一个包含2个项目的对象,每个项目都包含一个数字数组。

selected: {
  item1: [1, 2, 3],
  item2: [4, 5, 6]
}

在一个函数中,如果传递给它的数字不在任何一项中,我需要做一些事情。因此,例如,如果传递6则不执行任何操作,但如果传递了7则执行某些操作。

如果其中一个项目包含数字

,则返回true和false
Object.entries(selected).forEach((itemParent)=>{
  console.log(
    itemParent[1].some((itemChild)=>{
      return itemChild === no;
    })
  )
});

但是当我添加下面的代码时,我收到一个错误:Uncaught TypeError: Cannot read property 'some' of undefined

Object.entries(selected)
  .forEach((itemParent)=>{
    itemParent[1].some((itemChild)=>{
      return itemChild === no;
    })
  }
).some((item)=>{
  return item === true;
});

我正在使用bable,所以我可以使用最新的ES6语法。

5 个答案:

答案 0 :(得分:2)

假设对象与给定数据不同,那么您可以嵌套some并检查。然后返回检查结果。

return Object
    .entries(selected)
    .some(itemParent => itemParent[1].some(itemChild => itemChild === no))

答案 1 :(得分:2)

你太复杂了。顺便说一句,您甚至使用ES2017功能,因此请检查Babel是否已相应配置。

以下是您问题的简短解决方案:



const no = 7;

const selected = {
  item1: [1, 2, 3],
  item2: [4, 5, 6]
};

const containsNumber = Object.values(selected).some(array => array.includes(no));

console.log(containsNumber);




您收到错误消息的原因是forEach实际上没有返回任何内容。

答案 2 :(得分:1)

您的第二个示例中出现此错误,因为forEach未返回数组而undefined,而undefined没有任何名为some的方法

答案 3 :(得分:1)

您可以将Object.valuesconcat功能结合使用,以获得更简单的方法。



let selected= {
  item1: [1, 2, 3],
  item2: [4, 5, 6]
};
let contains= [].concat(...Object.values(selected)).includes(7);
console.log(contains);




答案 4 :(得分:0)

我认为这是一种更简单的方法:



var selected = {
  item1: [1, 2, 3],
  item2: [4, 5, 6]
}
function exists(inputNumber) {
    return Object.keys(selected).some(key => selected[key].some(number => number === inputNumber));
}
console.log(exists(6));
console.log(exists(7));




使用Object.values更简单:



var selected = {
  item1: [1, 2, 3],
  item2: [4, 5, 6]
}
function exists(inputNumber) {
    return Object.values(selected).some(arr => arr.some(number => number === inputNumber));
}
console.log(exists(6));
console.log(exists(7));