有没有一种简单的方法可以使嵌套数组扁平化
Is there an easy way to make nested array flat?
就是
要做这个:
[ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]
到:
['dog','cat','chicken','bear','mouse','horse']
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
});
// flattened is [0, 1, 2, 3, 4, 5]
值得注意的是,在IE 8及更低版本中不支持reduce。
developer.mozilla.org 参考
在现代浏览器中,您可以在没有任何外部库的情况下在几行中执行此操作:
Array.prototype.flatten = function() {
return this.reduce(function(prev, cur) {
var more = [].concat(cur).some(Array.isArray);
return prev.concat(more ? cur.flatten() : cur);
},[]);
};
console.log([['dog','cat',['chicken', 'bear']],['mouse','horse']].flatten());
//^ ["dog", "cat", "chicken", "bear", "mouse", "horse"]
Grab 下划线.js并使用 flatten 函数。
_.flatten([ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]);
这一个班轮代码呢?
console.log([['dog', 'cat', ['chicken', 'bear']], [['mouse', 'horse'], 'lion']].join().split(','));
基本上加入将使逗号分隔的字符串与嵌套数组分开,使用拆分可以获得 1D 数组,很好吗?奖金它也可以在所有主要浏览器上运行:)
ChewOnThis_Trident解决方案的小修复,它工作得很好:
Array.prototype.flatten = function() {
return this.reduce(function(a, b) {
return a.concat(b);
}, []);
};
假设一个数组已经从 JSON 中解压缩,请尝试以下操作:
Array.prototype.flatten = function() {
var r = [];
for (var i = 0; i < this.length; ++i) {
var v = this[i];
if (v instanceof Array) {
Array.prototype.push.apply(this, v.flatten());
} else {
r.push(v);
}
}
return r;
};
它似乎在您的输入上正常工作 - 请参阅 http://jsfiddle.net/alnitak/Ws7L5/
现在在2019年,您可以轻松地使用任何深度的Array.flat
。
let arr = [ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]
let op = arr.flat(Infinity)
console.log(op)
现在,如果您想获得唯一值,您可以同时组合设置和平面
let arr = [ ['dog','cat', ['chicken', 'bear', 'cat'] ],['mouse','horse', 'dog'], [[[['deeper','chicken']]]] ]
let unique = [...new Set(arr.flat(Infinity))]
console.log(unique)
浏览器可比性 除了IE之外,所有其他似乎都支持IE,您可以使用polyfill。我知道
这已经晚了,但我也遇到了需要将多维数组制作成 1 个数组的情况,我做了一个函数,如下所示。
function nested(arr) {
var noNest = arr.toString().split(',').filter(Boolean),
i = 0;
for(i;i<noNest.length; i++){
if(isNaN(noNest[i])){
return console.log(noNest);
} else {
noNest[i] = parseInt(noNest[i]);
}
}
return console.log(noNest);
}
nested([[['a']], [['b']]]);
这也将嵌套数组置于测试数组中,并确保其一个数组作为最终输出
这个解决方案对我来说效果很好,我发现它特别容易遵循:
function flattenArray(arr) {
// the new flattened array
var newArr = [];
// recursive function
function flatten(arr, newArr) {
// go through array
for (var i = 0; i < arr.length; i++) {
// if element i of the current array is a non-array value push it
if (Array.isArray(arr[i]) === false) {
newArr.push(arr[i]);
}
// else the element is an array, so unwrap it
else {
flatten(arr[i], newArr);
}
}
}
flatten(arr, newArr);
return newArr;
}
这就是为什么我喜欢javascript:
function flattenArray(source) {
return source.toString().split(',');
}
flattenArray([['dog', 'cat', ['chicken', 'bear']], ['mouse', 'horse']]);
// -> ['dog','cat','chicken','bear','mouse','horse']
展平任何深度的对象的最简单方法是使用平面方法
var arr = [['dog','cat', ['chicken', 'bear']],[['mouse','horse'],'lion'] ];
var flattened = arr.flat(Infinity);
//output--> ["dog", "cat", "chicken", "bear", "mouse", "horse", "lion"]
更多 aout Flat()
ES6 的方法是
[['a', 'b'], ['c', 'd']].reduce((x,v) => [...x, ...v], [])
相关文章:
- 有什么方法可以使页面无法刷新吗
- 有一种方法可以使jslint在使用控制台时显示警告或错误
- 有没有任何方法可以使<选择>转到url
- 有没有任何方法可以使这个名称生成循环运行最短的秒数
- JSXGraph 中有什么方法可以使图像不透明
- 有没有一种方法可以使Iframe根据需要进行扩展
- 是否可以使find()和findOne()方法只返回模式字段
- 有哪些方法可以使客户端更难操作 DOM
- 有什么方法可以使SVG对象可单击吗
- 是否可以使“;值“;Javascript中setTimeout()方法中的self-increase
- 有没有一种方法可以使触摸启动事件不会触发点击事件
- 当在模板中使用未声明的指令时,是否有任何方法可以使angular警告我
- 当用户在网页上选择一大块文本时,是否有一种方法可以使该文本保持高亮显示,即使用户在该页面的其他地方单击也是如此
- 是否有一种方法可以使输入元素上存在ngMaxlength属性,但使其具有值“0”;无限”;
- 有没有一种方法可以使;对象.冻结”;当试图更改对象时抛出警告
- 有没有一种方法可以使未被混淆的javascript过期
- 是否有一种方法可以使自定义HTML标记合并其他标记
- 是否有一种方法可以使函数在setTimeout之后返回
- 当使用鼠标滚轮时,是否有一种方法可以使滚动量在浏览器之间保持一致?
- 是否有一个简单的方法可以使js文件中的所有字符串比较不区分大小写