我正在尝试将此嵌套数组转换为平面数组。在使用这种方法解决问题时,似乎每次我回调arrayFlattener(element)时,newArr都会变成一个空数组。有人可以帮我弄这个吗?谢谢。
const arrayFlattener = (arr) => {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
let element = arr[i];
if (Array.isArray(element)){
newArr.push(arrayFlattener(element));
} else {
newArr.push(element);
}
}
return newArr;
}
console.log(arrayFlattener(['I', 'am', 'working', ['on', 'another', 'level']]));
答案 0 :(得分:2)
当前,您的函数并未使数组变平,而只是对数组的每个元素进行了解析。它仍然返回相同的数组结构。
要展平数组,还应该传递结果数组,以便可以将单个元素直接推入结果数组,而不是制作另一个数组并将其推入结果数组(这将产生相同的初始数组结构) )
let newArr = [];
const arrayFlattener = (arr, result) => {
for (let i = 0; i < arr.length; i++) {
let element = arr[i];
if (Array.isArray(element)){
result = arrayFlattener(element, result);
} else {
result.push(element);
}
}
return result
}
console.log(arrayFlattener(['I', 'am', 'working', ['on', 'another', 'level'], 'now'], newArr));
答案 1 :(得分:1)
您可以使用flatMap
let newArr = ['I', 'am', 'working', ['on', 'another', 'level']].flatMap(el=>el);
console.log(newArr);
或使用flat
var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2); // depth argument to flatten the array
// [1, 2, 3, 4, 5, 6]
答案 2 :(得分:1)
您的代码和理论很好。您只是选择了错误的方法。使用concat
代替push
(以扩展结果而不是插入结果):
const arrayFlattener = (arr) => {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
let element = arr[i];
if (Array.isArray(element)){
newArr = newArr.concat(arrayFlattener(element));
} else {
newArr.push(element);
}
}
return newArr;
}
console.log(arrayFlattener(['I', 'am', 'working', ['on', 'another', 'level']]));
答案 3 :(得分:1)
import cx_Oracle
import datetime
conn = cx_Oracle.connect("pythondemo/welcome")
cursor = conn.cursor()
numVar = cursor.var(int)
strVar = cursor.var(str)
dateVar = cursor.var(datetime.datetime)
boolVar = cursor.var(bool)
numVar.setvalue(0, 6)
strVar.setvalue(0, "Test String")
dateVar.setvalue(0, datetime.datetime(2016, 5, 28))
boolVar.setvalue(0, False)
# show the original values
print("NUMBERVALUE ->", numVar.getvalue())
print("STRINGVALUE ->", strVar.getvalue())
print("DATEVALUE ->", dateVar.getvalue())
print("BOOLEANVALUE ->", boolVar.getvalue())
print()
cursor.execute("""
declare
t_Record pkg_Demo.udt_DemoRecord;
begin
t_Record.NumberValue := :numVar;
t_Record.StringValue := :strVar;
t_Record.DateValue := :dateVar;
t_Record.BooleanValue := :boolVar;
pkg_Demo.DemoRecordsInOut(t_Record);
:numVar := t_Record.NumberValue;
:strVar := t_Record.StringValue;
:dateVar := t_Record.DateValue;
:boolVar := t_Record.BooleanValue;
end;""",
numVar = numVar,
strVar = strVar,
dateVar = dateVar,
boolVar = boolVar)
# show the modified values
print("NUMBERVALUE ->", numVar.getvalue())
print("STRINGVALUE ->", strVar.getvalue())
print("DATEVALUE ->", dateVar.getvalue())
print("BOOLEANVALUE ->", boolVar.getvalue())
print()
用flat
depth
级来完成这项工作,指定嵌套数组结构应展平的深度。
示例
param
答案 4 :(得分:0)
您可以使用.flatMap
并进行递归或
const flatten = (xs) =>
Array.isArray(xs) ? xs.flatMap(flatten) : [xs]
const array = ['I', 'am', 'working', ['on', 'another', ['level']]]
console.log(flatten(array))
您可以使用.reduce
和递归
const flatten = (xs) =>
xs.reduce(
(y, x) => y.concat(Array.isArray(x) ? flatten(x) : [x]),
[])
const array = ['I', 'am', 'working', ['on', 'another', ['level']]]
console.log(flatten(array))
甚至更好的是使用.flat
const flatten = (xs) =>
xs.flat(Infinity)
const array = ['I', 'am', 'working', ['on', 'another', ['level']]]
console.log(flatten(array))