使用标题破坏
Destruct using titles
我已经用 destructing 回答了几个问题,我只是想把这个提升到一个新的水平
我不想在这个例子中使用 reduce,而是尽可能使用纯破坏
因此数据的第一行包含 object 的属性名称,我怎样才能将其用作 DRY
即我希望
const obj = data.slice(1).map((titles) => ({ titles }) )
或类似
所以这行得通,但我还漏了一步:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const titles = data[0]; // not used below but I want to use it
const obj = data.slice(1).map(([fruits,frozen,fresh,rotten]) => ({ fruits,frozen,fresh,rotten }) )
console.log(obj)
你可以使用reduce
,但你不能真正破坏...
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const titles = data[0];
const obj = data.slice(1).map((row) => titles.reduce((agg, cur, index) => {
agg[cur] = row[index];
return agg;
}, {}));
console.log(obj)
您可以映射对象的条目。
const
data = [["fruits", "frozen", "fresh", "rotten"], ["apples", 884, 494, 494], ["oranges", 4848, 494, 4949], ["kiwi", 848, 33, 33]],
mapWith = keys => values => Object.fromEntries(keys.map((k, i) => [k, values[i]])),
getArray = ([keys, ...data]) => data.map(mapWith(keys)),
array = getArray(data);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
旧的更简单的例子
const data = [
["fruits", "frozen", "fresh", "rotten"],
["apples", 884, 494, 494],
["oranges", 4848, 494, 4949],
["kiwi", 848, 33, 33]
]
const titles = data[0];
const obj = data.slice(1).map(
arr => Object.fromEntries(
titles.map(
(t, i) => [t, arr[i]]
)
)
);
console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以创建 zip
的柯里化版本,它与 Object.fromEntries
类似,不同之处在于它不采用对,而是键列表和值列表以及基于索引:
zip(['a','b'], [1,2]);
//=> {a: 1, b: 2})
因为它是柯里化的,所以您可以在地图中使用它并避免硬编码标题:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const zip =
keys =>
values =>
Object.fromEntries
( keys.map((k, i) => [k, values[i]])
);
const from_csv =
([titles, ...rows]) =>
rows.map(zip(titles));
console.log(
from_csv(data)
);
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
];
const [titles, ...rest] = data;
const obj = rest.map((xs) => {
const o = {};
xs.forEach((x,i) => o[titles[i]] = x);
return o;
});
console.log(obj);
我已经用 destructing 回答了几个问题,我只是想把这个提升到一个新的水平
我不想在这个例子中使用 reduce,而是尽可能使用纯破坏
因此数据的第一行包含 object 的属性名称,我怎样才能将其用作 DRY
即我希望
const obj = data.slice(1).map((titles) => ({ titles }) )
或类似
所以这行得通,但我还漏了一步:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const titles = data[0]; // not used below but I want to use it
const obj = data.slice(1).map(([fruits,frozen,fresh,rotten]) => ({ fruits,frozen,fresh,rotten }) )
console.log(obj)
你可以使用reduce
,但你不能真正破坏...
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const titles = data[0];
const obj = data.slice(1).map((row) => titles.reduce((agg, cur, index) => {
agg[cur] = row[index];
return agg;
}, {}));
console.log(obj)
您可以映射对象的条目。
const
data = [["fruits", "frozen", "fresh", "rotten"], ["apples", 884, 494, 494], ["oranges", 4848, 494, 4949], ["kiwi", 848, 33, 33]],
mapWith = keys => values => Object.fromEntries(keys.map((k, i) => [k, values[i]])),
getArray = ([keys, ...data]) => data.map(mapWith(keys)),
array = getArray(data);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
旧的更简单的例子
const data = [
["fruits", "frozen", "fresh", "rotten"],
["apples", 884, 494, 494],
["oranges", 4848, 494, 4949],
["kiwi", 848, 33, 33]
]
const titles = data[0];
const obj = data.slice(1).map(
arr => Object.fromEntries(
titles.map(
(t, i) => [t, arr[i]]
)
)
);
console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以创建 zip
的柯里化版本,它与 Object.fromEntries
类似,不同之处在于它不采用对,而是键列表和值列表以及基于索引:
zip(['a','b'], [1,2]);
//=> {a: 1, b: 2})
因为它是柯里化的,所以您可以在地图中使用它并避免硬编码标题:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const zip =
keys =>
values =>
Object.fromEntries
( keys.map((k, i) => [k, values[i]])
);
const from_csv =
([titles, ...rows]) =>
rows.map(zip(titles));
console.log(
from_csv(data)
);
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
];
const [titles, ...rest] = data;
const obj = rest.map((xs) => {
const o = {};
xs.forEach((x,i) => o[titles[i]] = x);
return o;
});
console.log(obj);