【问题标题】:JS - Merge ObjectsJS - 合并对象
【发布时间】:2022-11-23 04:15:22
【问题描述】:

我需要合并/合并 4 个内部对象和数组。 这些对象是:

{"field": "name","lang": "it","text": "RegoleAziendali"}
{"field": "pdf_url","lang": "it", "text": "docs/it/file.pdf"}
{"field": "name","lang": "en","text": "CompanyRules"}
{"field": "pdf_url","lang": "en", "text": "docs/en/file.pdf"}

预期结果应该由语言合并的 2 个对象组成。

{"lang": "it","name": "RegoleAziendali","pdf_url":"docs/it/file.pdf"}
{"lang": "en","name": "CompanyRules","pdf_url":"docs/en/file.pdf"}

目前我正在使用 array.forEach 通过 lang 合并两个对象。但我找不到操纵值/属性的方法。如您所见,合并后的对象不再需要属性“字段”。

【问题讨论】:

  • 使用一个对象,其键是语言,值是新对象。然后您可以遍历原始数组,将属性添加到适当的新对象。
  • 你试过什么?我们不是免费的编码服务。见How to Ask
  • 变量对象={}; array.forEach(function(e){ if(e && e.lang){ obj[e.lang] = obj[e.lang] || {}; for(var _k in e) obj[e.lang][ _k] = e[_k] } });返回 Object.keys(obj).map(function (key) {return obj[key]});

标签: javascript object merge


【解决方案1】:

假设您有一个数组,您可以将其转换为分组问题。

使用 reducelang 分组。
之后使用Object.values获取分组对象的值数组

const x = [
{"field": "name","lang": "it","text": "RegoleAziendali"},
{"field": "pdf_url","lang": "it", "text": "docs/it/file.pdf"},
{"field": "name","lang": "en","text": "CompanyRules"},
{"field": "pdf_url","lang": "en", "text": "docs/en/file.pdf"}
]

const res = Object.values(x.reduce((acc,{field,lang,text}) => {
  acc[lang] = acc[lang] || {lang}
  acc[lang][field] = text
  return acc
},{}))

console.log(res)

使用 for 循环可以完成同样的事情

const x = [{"field": "name","lang": "it","text": "RegoleAziendali"},{"field": "pdf_url","lang": "it", "text": "docs/it/file.pdf"},{"field": "name","lang": "en","text": "CompanyRules"},{"field": "pdf_url","lang": "en", "text": "docs/en/file.pdf"}]

const res = {}
for (const entry of x){
  const {field,lang,text} = entry
  res[lang] = res[lang] || {lang}
  res[lang][field] = text
}

console.log(Object.values(res))

【讨论】:

  • 谢了哥们。我想知道您在哪里学习以优雅的方式编码!
【解决方案2】:

挑选某些字段:

const data = [
  {"field": "name","lang": "it","text": "RegoleAziendali"},
  {"field": "pdf_url","lang": "it", "text": "docs/it/file.pdf"},
  {"field": "name","lang": "en","text": "CompanyRules"},
  {"field": "pdf_url","lang": "en", "text": "docs/en/file.pdf"}
]

const lookup = (lang, field) => ({
  [field]: data.find(i=>i.lang===lang && i.field===field).text
})

console.log([...new Set(data.map(i=>i.lang))].map(lang=>({
  lang, ...lookup(lang, 'name'), ...lookup(lang, 'pdf_url')
})))

【讨论】:

    【解决方案3】:

    const arr = [{"field": "name","lang": "it","text": "RegoleAziendali"}, {"field": "pdf_url","lang": "it", "text": "docs/it/file.pdf"}, {"field": "name","lang": "en","text": "CompanyRules"}, {"field": "pdf_url","lang": "en", "text": "docs/en/file.pdf"}];
    
    const ans = arr.reduce((a,{field:f,lang:l,text:t}) => ({...a, [l]: {...a[l], [f]: t, lang: l}}), {});
    
    console.log(Object.values(ans));

    【讨论】:

    • 哦,非常好的方法。
    • 我也喜欢这个解决方案,虽然我很难理解它与 js 忍者完全相反
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多