使用标题破坏

Posted

技术标签:

【中文标题】使用标题破坏【英文标题】:Destruct using titles 【发布时间】:2020-09-23 14:14:45 【问题描述】:

我已经用 destructing 回答了几个问题,我只是想把这个问题更上一层楼

我不想在这个例子中使用 reduce,而是尽可能地使用纯破坏

所以数据的第一行包含对象的属性名称,我怎样才能使用它来干燥

即我希望

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方法创建对象。 为什么这个问题被否决了? 【参考方案1】:

你可以使用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)

【讨论】:

谢谢 - 有趣的例子 - 我真的不想减少【参考方案2】:

您可以映射对象的条目。

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; 

【讨论】:

Okeee,现在我必须弄清楚你在那里做了什么;))) 我保存了第一个,因为我想通了。然后你稍微提高了赌注。新示例的性能如何?看起来处理很多 仅此而已。它只是拆分数组并获取键的第一行,其余的作为值进行迭代。 我不明白两个粗箭头的语法:mapWith = keys => values => 这只是对参数的一个闭包,并在最后返回一个带有另一个参数的函数。【参考方案3】:

您可以创建zip 的柯里化版本,它类似于Object.fromEntries,只是它不采用对,而是基于索引形成键列表以及值和对的列表:

zip(['a','b'], [1,2]);
//=> a: 1, b: 2)

因为它是 curried,所以您可以在地图中使用它并避免硬编码标题:

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)
);

【讨论】:

谢谢 - 有趣的例子 @mplungjan 因为你似乎不喜欢Array#reduce,所以我修改了zip 函数以使用Object.fromEntries。这样地图是“本地”构建的。除非有很多对,否则不太可能引起注意。但是你去;)【参考方案4】:

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);

【讨论】:

是的,这是正常的。它也可以重写为reduce

以上是关于使用标题破坏的主要内容,如果未能解决你的问题,请参考以下文章

使用 forceRootUrl() 会破坏一些路由

使用虚拟的破坏顺序

使用查询参数缓存获取的破坏图像

Vue 全局变量破坏使用 TypeScript 构建

使用ajax在浏览器中单击时破坏php会话

使用核心数据破坏多线程