[英]JavaScript: Function creates arrays as values of the returned object
我正在創建一個接受數組和回調並返回 object 的 function。 它旨在遍歷數組並對每個元素執行回調。 然后,回調的每個返回值都保存為 object 上的鍵。 與每個鍵關聯的值將是一個數組,該數組由傳遞給回調時產生該返回值的所有元素組成。
function groupBy(array, callback) {
let obj = {};
let newArr = [];
//loop through each ele w/ callback
//return value saved as key in obj obj[key] = value
array.forEach(ele => {
let key = callback(ele)
obj[key] = callback(ele);
if (obj[key] === undefined) {
obj[key] = array[ele]
newArr.push(array[ele]);
} else {
newArr.push(obj[key]);
}
});
return obj;
}
function 應該創建 arrays 作為返回的 object 的值,但它沒有。 此外,如果回調在傳入時返回相同的值,它不會將數組項組合在一起。
測試用例:
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) { return Math.floor(num); };
console.log(groupBy(decimals, floored)); // should log: **{ 1: [1.3], 2: [2.1, 2.4] }**
相反,我得到: { 1: 1, 2: 2 }</be expected { odd: 'odd', even: 'even' } 深度等於 {odd: [ 1, 3, 5 ], even: [ 2, 4 ] }
您的代碼存在不止 1 個問題。
首先,您正在使用obj[key] = callback(ele)
分配key
給object[key]
其次,您正在推入newArr
數組,但從未使用它。
下面的片段可能會對您有所幫助。
function groupBy(array, callback) { let obj = {}; //loop through each ele w/ callback //return value saved as key in obj obj[key] = value array.forEach(ele => { let key = callback(ele) obj[key] = obj[key] || []; // ^^^^ Create an empty array if it doesn't exist obj[key].push(ele) }); return obj; } const decimals = [1.3, 2.1, 2.4]; const floored = function(num) { return Math.floor(num); }; console.log(groupBy(decimals, floored)); // should log: **{ 1: [1.3], 2: [2.1, 2.4] }**
更新
你也可以使用Array.reduce()
function groupBy(array, callback) { return array.reduce((acc,cur) => { let key = callback(cur) acc[key] = acc[key] || []; acc[key].push(cur) return acc; },{}) } const decimals = [1.3, 2.1, 2.4]; const floored = function(num) { return Math.floor(num); }; console.log(groupBy(decimals, floored));
function groupBy(array, callback) {
let obj = {};
//loop through each ele w/ callback
//return value saved as key in obj obj[key] = value
array.forEach(ele => {
let key = callback(ele)
if (obj[key] === undefined) {
obj[key] = [ele]
} else {
obj[key].push(ele);
}
});
return obj;
}
您不應該覆蓋密鑰,而是應該獲取數組並將其推送到數組。
function groupBy(array, callback) { let obj = {}; let newArr = []; //loop through each ele w/ callback //return value saved as key in obj obj[key] = value array.forEach(ele => { let key = callback(ele) //obj[key] = key; let newArr = obj[key]; if (newArr === undefined) { newArr = new Array(); } newArr.push(ele); obj[key] = newArr; }); return obj; } const decimals = [1.3, 2.1, 2.4]; const floored = function(num) { return Math.floor(num); }; console.log(groupBy(decimals, floored));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.