2017-10-09 19 views
0

我有一個包含2個項目的對象,每個項目都包含一個數字數組。使用JavaScript進行兩次問題測試

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

在函數中,如果傳遞給它的數字不在任一項中,我需要做一些操作。因此,舉例來說,如果傳遞了6,什麼都不做,但如果傳遞7,那麼做一些事情。 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; 
}); 

進出口使用巴布爾所以我:

如果一個項目包含數字

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

但是當我添加下面的代碼,我得到一個錯誤下返回true和false可以使用最新的ES6語法。

+1

原因'itemParent所[1]''是或2''5' ...'itemParent'是陣列和'itemParent所[I]'是陣列 – demo

+2

您的代碼的元件'forEach'回調內部實際上沒有做任何事情。你檢查'itemParent [1] .some((itemChild)=> {return itemChild === no;})',但是你不會對結果做任何事情,所以它會立即被丟棄。那麼,當然'forEach'返回'undefined',所以你不能在它之後鏈接另一個'some'。無論如何你爲什麼使用'forEach'? – Xufox

+0

@Evans,我們的答案呢? –

回答

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));

+1

不會'Object.values'或'Object.entries'比'Object.keys'更好嗎? – Xufox

+0

是的,使用Object.values,它會更簡單 – Faly

+1

@Faly,或者使用'concat'和'spread syntax':'let contains = [] .concat(... Object.values(selected))。includes(7 );' –

2

假設對象與給定數據不同,那麼可以嵌套some並進行檢查。然後返回檢查結果。

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

你在你的第二個例子中得到這個錯誤,因爲forEach不返回數組,但undefined,並undefined沒有名爲some任何方法。

2

你是overcomplicat事情。順便說一句,你甚至使用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實際上並不返回任何東西。

1

您可以將Object.valuesconcat函數結合使用以獲得更簡單的方法。

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