【问题标题】:Javascript array de-structuring and Object.entriesJavascript 数组解构和 Object.entries
【发布时间】:2017-07-11 05:37:00
【问题描述】:

这很简单:Object.entriesis supposed to produce and Array of key, value pairs.。因此,我希望这段代码能够解构

[{
  id: 1,
  name: "christian"
},{
  id : 2,
  name: "bongiorno"
}].map(Object.entries).forEach(([k,v]) => console.log(`${k}: ${v}`));

投入生产:

id:1 name:christian
id:2 name:bongiorno

但事实并非如此。相反,我得到了:

id,1: name,christian
id,2: name,bongiorno

我错过了什么?

【问题讨论】:

  • 因为你的数据不是简单的Object,它的Object Array。对象数组包含对象,因此您需要嵌套循环来遍历数据。
  • @WasifKhan 问题中没有 JSON……而且没有“JSON 对象”之类的东西
  • 我添加了.reduce((a,b) => a.concat(b),[]) 以将其展平。看起来更好。我应该更新问题吗?提供答案?
  • @ChristianBongiorno 这听起来像是一个答案,不属于问题。
  • 我加了this跟进

标签: javascript ecmascript-6 destructuring


【解决方案1】:

输出正确,但您的定义略有偏差,您缺少数组级别(数组数组)。

Object.entries 应该产生一个键值对数组。

console.log(
  Object.entries({
    id: 1,
    name: 'test'
  })
)

要实现您想要的,您只需更新您的日志以考虑嵌套数组:

[{
  id: 1,
  name: "christian"
},{
  id : 2,
  name: "bongiorno"
}]
  .map(Object.entries)
  .forEach(([k, v]) => console.log(
    `${k.join(':')} ${v.join(':')}`
  ));

或者你的意思是扁平化每个数组?:

[{
  id: 1,
  name: "christian"
},{
  id : 2,
  name: "bongiorno"
}]
  .map(Object.entries)
  .reduce((arr, curr) => arr.concat(curr), [])
  .forEach(([k,v]) => console.log(`${k}: ${v}`));
  

【讨论】:

  • 这就是我一直在寻找的东西,我做到了。但是,我对其他事情更加困惑。我想我会创建一个新问题。
【解决方案2】:

让我们尝试删除mapforEach,看看你对每个对象做了什么:

let [k, v] = Object.entries({
  id: 1,
  name: "christian"
});
console.log(`${k}: ${v}`);

let [k, v] = Object.entries({
  id : 2,
  name: "bongiorno"
});
console.log(`${k}: ${v}`);

现在,如果我们扩展 Object.entries 调用,则变为

let [k, v] = [
  ["id", 1],
  ["name", "christian"]
];
console.log(`${k}: ${v}`);

let [k, v] = [
  ["id", 2],
  ["name", "bongiorno"]
];
console.log(`${k}: ${v}`);

这非常准确地反映了您所看到的 - kv 正在分配数组。

你需要嵌套两个循环:

const arr = [{
  id: 1,
  name: "christian"
}, {
  id: 2,
  name: "bongiorno"
}];
for (const obj of arr)
    for (const [k, v] of Object.entries(obj))
        console.log(k+": "+v);

【讨论】:

  • @ChristianBongiorno 为此,您需要某种 flatMap,这在 JS 中不存在。但是如果你用一个简单的for of循环替换forEach,那就很简单了
  • 而不是 for 循环我只是 .reduce((a,b) => a.concat(b),[]) 将其展平
猜你喜欢
  • 2017-12-15
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多