Giả sử tôi có mảng sau của các đối tượng lưu trữ một cặp khóa \ giá trị:
var someArray = [
{foo: 1},
{bar: 2}
];
Tôi muốn làm phẳng mảng này vào một đối tượng, trong đó mỗi khóa từ các đối tượng gốc trở thành một thuộc tính của đối tượng đơn mới như vậy:
someObject = {
foo: 1,
bar: 2
}
Tôi sẽ luôn có các khóa duy nhất và chỉ có một khóa ghép giá trị.
Tôi biết nếu tôi lặp qua mảng trong một foreach, thì tôi chỉ có thể truy cập vào chỉ mục và giá trị của mục, ví dụ:
0: {foo: 1}
Tôi muốn có thể lặp lại và khi truy cập mục, hãy đọc khóa và giá trị riêng biệt để tôi có thể nối vào đối tượng mới của mình.
Tôi cảm thấy như Lodash sẽ có thể giúp đỡ ở đây, nhưng tôi đang vật lộn để tìm ra phương pháp của họ có thể giúp ích.
Ai đó có thể chỉ cho tôi đi đúng hướng?
Cảm ơn
Phương pháp
0 tạo ra một mảng mới với tất cả các phần tử mảng con được liên kết vào nó đệ quy đến độ sâu được chỉ định.someObject = {
foo: 1,
bar: 2
}
0 method creates a new array with all sub-array elements concatenated into it recursively up to the specified depth. someObject = {
foo: 1,
bar: 2
}
Thử nó
Cú pháp
Thông số
someObject = {
foo: 1,
bar: 2
}
1 Tùy chọnOptionalMức độ sâu chỉ định mức độ sâu của cấu trúc mảng lồng nhau nên được làm phẳng. Mặc định là 1.
Giá trị trả về
Một mảng mới với các phần tử con được nối với nó.
Sự mô tả
Phương pháp
someObject = {
foo: 1,
bar: 2
}
0 là một phương thức sao chép. Nó không thay đổi someObject = {
foo: 1,
bar: 2
}
3 mà thay vào đó trả về một bản sao nông chứa các phần tử giống như các phần tử từ mảng gốc.Phương pháp
someObject = {
foo: 1,
bar: 2
}
0 bỏ qua các khe trống nếu mảng được làm phẳng là thưa thớt. Ví dụ, nếu someObject = {
foo: 1,
bar: 2
}
1 là 1, cả hai khe trống trong mảng gốc và ở cấp độ đầu tiên của các mảng lồng nhau đều bị bỏ qua, nhưng các khe trống trong các mảng lồng tiếp theo được bảo tồn với chính các mảng.Phương pháp
someObject = {
foo: 1,
bar: 2
}
0 là chung chung. Nó chỉ mong đợi giá trị someObject = {
foo: 1,
bar: 2
}
3 có thuộc tính someObject = {
foo: 1,
bar: 2
}
8 và các thuộc tính được khóa. Tuy nhiên, các yếu tố của nó phải là mảng nếu chúng bị san phẳng.Lựa chọn thay thế
giảm và liên kết
const arr = [1, 2, [3, 4]];
// To flat single level array
arr.flat[];
// is equivalent to
arr.reduce[[acc, val] => acc.concat[val], []];
// [1, 2, 3, 4]
// or with decomposition syntax
const flattened = [arr] => [].concat[...arr];
Giảm + Concat + Isarray + đệ quy
const arr = [1, 2, [3, 4, [5, 6]]];
// to enable deep level flatten use recursion with reduce and concat
function flatDeep[arr, d = 1] {
if [!Array.isArray[arr]] {
return arr;
}
return d > 0
? arr.reduce[[acc, val] => acc.concat[flatDeep[val, d - 1]], []]
: arr.slice[];
}
flatDeep[arr, Infinity];
// [1, 2, 3, 4, 5, 6]
Sử dụng một ngăn xếp
// non recursive flatten deep using a stack
// note that depth control is hard/inefficient as we will need to tag EACH value with its own depth
// also possible w/o reversing on shift/unshift, but array OPs on the end tends to be faster
function flatten[input] {
const stack = [...input];
const res = [];
while [stack.length] {
// pop value from stack
const next = stack.pop[];
if [Array.isArray[next]] {
// push back array items, won't modify the original input
stack.push[...next];
} else {
res.push[next];
}
}
// reverse to restore input order
return res.reverse[];
}
const arr = [1, 2, [3, 4, [5, 6]]];
flatten[arr];
// [1, 2, 3, 4, 5, 6]
Sử dụng hàm máy phát điện
function* flatten[array, depth] {
if [depth === undefined] {
depth = 1;
}
for [const item of array] {
if [Array.isArray[item] && depth > 0] {
yield* flatten[item, depth - 1];
} else {
yield item;
}
}
}
const arr = [1, 2, [3, 4, [5, 6]]];
const flattened = [...flatten[arr, Infinity]];
// [1, 2, 3, 4, 5, 6]
Ví dụ
Làm phẳng mảng lồng nhau
const arr1 = [1, 2, [3, 4]];
arr1.flat[];
// [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat[];
// [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat[2];
// [1, 2, 3, 4, 5, 6]
const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat[Infinity];
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Sử dụng flat [] trên các mảng thưa thớt
Phương thức
someObject = {
foo: 1,
bar: 2
}
0 loại bỏ các khe trống trong các mảng:const arr5 = [1, 2, , 4, 5];
console.log[arr5.flat[]]; // [1, 2, 4, 5]
const array = [1, , 3, ["a", , "c"]];
console.log[array.flat[]]; // [ 1, 3, "a", "c" ]
const array2 = [1, , 3, ["a", , ["d", , "e"]]];
console.log[array2.flat[]]; // [ 1, 3, "a", ["d", empty, "e"] ]
console.log[array2.flat[2]]; // [ 1, 3, "a", "d", "e"]
Gọi phẳng [] trên các đối tượng không phải là
Phương thức
someObject = {
foo: 1,
bar: 2
}
0 đọc thuộc tính someObject = {
foo: 1,
bar: 2
}
8 của someObject = {
foo: 1,
bar: 2
}
3 và sau đó truy cập vào từng chỉ mục số nguyên. Nếu phần tử không phải là một mảng, nó sẽ được nối trực tiếp với kết quả. Nếu phần tử là một mảng, nó sẽ được làm phẳng theo tham số someObject = {
foo: 1,
bar: 2
}
1.const arrayLike = {
length: 3,
0: [1, 2],
// Array-like objects aren't flattened
1: { length: 2, 0: 3, 1: 4 },
2: 5,
};
console.log[Array.prototype.flat.call[arrayLike]];
// [ 1, 2, { '0': 3, '1': 4, length: 2 }, 5 ]
Thông số kỹ thuật
Đặc tả ngôn ngữ Ecmascript # sec-array.prototype.flat # sec-array.prototype.flat |
Tính tương thích của trình duyệt web
Bảng BCD chỉ tải trong trình duyệt