我最近被问到一个面试问题,以表示一个给定的数组。例如,给出以下输入
var list = ['Adam', 'Brad', 'Cari', 'Donna', 'Ethan', 'Fred', 'Grok', 'Han', 'Izzy', 'Jay'];
var columns = 3; // 2 or 4...., etc
输出应如下所示
// [
// [ 'Adam', 'Ethan', 'Izzy'],
// [ 'Brad', 'Fred', 'Jay'],
// [ 'Cari', 'Grok'],
// [ 'Donna', 'Han']
]
我提供了以下功能,我必须实现逻辑
function tableify (list, columns) {
var result = [];
return result;
}
console.log(JSON.stringify( tableify(list, columns)));
我能够解决问题的一半,在给定列输入的情况下,您将使用数组的长度进行划分并使用它来推送子数组中的值
例如,如果列值为' 2'输出看起来像下面的
[
['Adam', 'Fred']
['Brad', 'Grok']
['Cari','Han']
['Donna','Izzy']
['Ethan','Jay']
]
我正在努力放下潜在的逻辑
编辑:
这是我的尝试
function tableify (list, columns) {
var result = [];
var rows = Math.ceil(list.length/ columns);
var removed = list.splice(rows, list.length -1);
//console.log(rows);
//console.log(removed);
for(var i = 0; i < list.length; i++){
result.push([list[i]]);
}
var j = 0;
var join = result.map(function(elements){
console.log(elements);
elements.push(removed[j])
j++;
});
return result;
}
我的思维过程是有两个不同的数组,其中一个包含[&#39; Adam&#39;,&#39; Brad&#39;&#39; Cari&#39; ,&#39; Donna&#39;]以及&#34;删除&#34; 数组中的其他项目。
执行拼接后,我想将原始数组中的其余项目推送到&#34;结果&#34; ,然后调用映射方法从&#34;删除&#34; 数组到结果。
但问题是它只会将元素映射到第二列并跳过第三列的元素
答案 0 :(得分:1)
过了一段时间我开发了。这种情况的算法。这是:
function tableify (list, columns) {
var countUsed = 0;
var len = list.length;
var maxRow = Math.ceil(len / columns);
var result = [];
for(i = 0; countUsed < len; i++){
for(j = 0; j < maxRow && countUsed < len; j++){
//check if the sub array is initialized
if(!result[j]){
result[j] = [];
}
result[j][i] = list[countUsed];
countUsed++;
}
}
return result;
}
//output test
var list = ["Adam", "Brad", "Cari", "Donna", "Ethan", "Fred", "Grok", "Han", "Izzy", "Jay"];
var columns = 3;
var a = tableify(list, columns);
document.write(JSON.stringify(a));
输出将如您所愿:
[
[ 'Adam', 'Ethan', 'Izzy'],
[ 'Brad', 'Fred', 'Jay'],
[ 'Cari', 'Grok'],
[ 'Donna', 'Han']
]
我在许多其他情况下进行了测试,但它确实有效。