首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果密钥名相同,如何合并1个JSON文件的2个属性?

如果密钥名相同,如何合并1个JSON文件的2个属性?
EN

Stack Overflow用户
提问于 2022-02-11 10:02:49
回答 3查看 43关注 0票数 1

我有以下JSON:

代码语言:javascript
复制
[
    {
        "computers": {
            "available": [
                6,
                2
            ],
            "held": [],
            "upgrades": [],
            "installed": [
                "PC-1"
            ]
        },
        "version": "0.6.55-0ubuntu12~20.04.4",
        "name": "accountsservice",
        "summary": "query and manipulate user account information"
    },
    {
        "computers": {
            "available": [
                209,
                211,
                210
            ],
            "held": [],
            "upgrades": [],
            "installed": [
                "PC-3"
            ]
        },
        "version": "0.6.45-1ubuntu1.3",
        "name": "accountsservice",
        "summary": "query and manipulate user account information"
    }
]

我想对数据进行检查,以检查name属性是否有任何重复的值。因此,有两个accountservices,但它们有不同的version值。

我如何组合2,使我只有1 accountservices,但2 version在其中使用ReactJS?其他数据与此无关,因此也可以删除或合并,我只想列出每个name的不同name

预期产出:

代码语言:javascript
复制
[
    {
        "version": "0.6.55-0ubuntu12~20.04.4, 0.6.45-1ubuntu1.3",
        "name": "accountsservice",
        "summary": "query and manipulate user account information"
    }
]

我尝试使用我在网上找到的以下函数,但无法让它正常工作:

代码语言:javascript
复制
const sanitize = (source_array) => { 
      let output = [];
  
      source_array.forEach( e => {
        if (output.filter( e1 => e1.name === e.name ).length === 0) {
         let unique_e = source_array.filter(j => j.name === e.name );
         let model = {};
        if (unique_e.length === 1)
          model = e;
        else {
          model.name = e.name;
          model.computers.installed = e.computers.installed;
          model.version = [];
          for ( const el of unique_e ) {
              const { version } = el;
              model.version.push({version});
        }
      }
     output.push(model)
     }
    });
      return output 
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-11 10:14:09

这是精简功能的完美用例。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

您的清洁功能可能看起来像这样:

代码语言:javascript
复制
const sanitize = (source_array) => { 
  const output = source_array.reduce((acc, { name, version, summary }) => {
    // try to find an entry with same name
    const entry = acc.find(e => e.name === name)
    if (entry) {
      // There was already an entry with this name !
      entry.version += `,${version}` 
    } else {
      acc.push({ name, version, summary })
    }
    return acc
  }, []);
  return output 
}

票数 1
EN

Stack Overflow用户

发布于 2022-02-11 10:16:33

这样就能完成任务

代码语言:javascript
复制
let source_array = [
  {
    computers: {
      available: [6, 2],
      held: [],
      upgrades: [],
      installed: ["PC-1"]
    },
    version: "0.6.55-0ubuntu12~20.04.4",
    name: "accountsservice",
    summary: "query and manipulate user account information"
  },
  {
    computers: {
      available: [209, 211, 210],
      held: [],
      upgrades: [],
      installed: ["PC-3"]
    },
    version: "0.6.45-1ubuntu1.3",
    name: "accountsservice",
    summary: "query and manipulate user account information"
  }
];

let output = [];

source_array.map((item) => {
  let filter = output.filter((i) => i.name === item.name);
  if (filter.length) {
    filter[0].version += `, ${item.version}`;
  } else {
    output.push({
      version: item.version,
      name: item.name,
      summary: item.summary
    });
  }
});

console.log(output);

票数 1
EN

Stack Overflow用户

发布于 2022-02-11 10:16:57

这也是可行的。此解决方案使用name进行分组,并列出每个nameversions,并按不同版本对计算机进行分组。

代码语言:javascript
复制
const input = [ { computers: { available: [6, 2], held: [], upgrades: [], installed: ["PC-1"], }, version: "0.6.55-0ubuntu12~20.04.4", name: "accountsservice", summary: "query and manipulate user account information", }, { computers: { available: [209, 211, 210], held: [], upgrades: [], installed: ["PC-3"], }, version: "0.6.45-1ubuntu1.3", name: "accountsservice", summary: "query and manipulate user account information", }, ];

const output = Object.entries(
  input.reduce((prev, { name, version, computers }) => {
    // check for the same name
    if (prev[name]) {
      prev[name].version.push(version);
      // check for the same version of computers in under same name
      if (prev[name].computers[version]) {
        prev[name].computers[version].push(computers);
      } else {
        prev[name].computers[version] = [computers];
      }
    } else {
      // name is identified for the first time
      // create a new entry for that
      prev[name] = {
        version: [version],
        computers: { [version]: [computers] },
      };
    }
    return prev;
  }, {})
).map(([key, { version, computers }]) => ({
  name: key,
  versions: version,
  computers,
}));

console.log(output);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71078220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档