【问题标题】:Merging multiple JSON objects from an array together [closed]将数组中的多个 JSON 对象合并在一起[关闭]
【发布时间】:2021-02-18 19:04:15
【问题描述】:

我有一个 JSON 对象数组,我想将具有相同文本的对象合并在一起,同时找到所有相同实例的相关性平均值和计数总和。


var keywords = [
            {
                "text": "service businesses",
                "relevance": 0.626303,
                "count": 1
            },
            {
                "text": "service businesses",
                "relevance": 0.87319,
                "count": 5
            },
            {
                "text": "service businesses",
                "relevance": 0.05,
                "count": 100
            },
            {
                "text": "restaurants",
                "relevance": 0.614567,
                "count": 16
            },
            {
                "text": "restaurants",
                "relevance": 0.609875,
                "count": 4
            },
            {
                "text": "hotels",
                "relevance": 0.594905,
                "count": 1
            },

我尝试了the solution posted here,但是我得到了这样的输出:

{
    text: 'service businesses',
    count: '[object Object][object Object]'
  }

我希望的输出如下所示:

            {
                "text": "service businesses",
                "relevance": 0.516497667,
                "count": 106
            },

            {
                "text": "restaurants",
                "relevance": 0.612221,
                "count": 20
            },
            {
                "text": "hotels",
                "relevance": 0.594905,
                "count": 1
            },

非常感谢任何帮助!

【问题讨论】:

  • 您需要发布您的代码,以便我们了解您如何错误地应用解决方案并展示如何解决它。

标签: javascript arrays merge mapreduce lodash


【解决方案1】:

使用Array.prototype.reduce,您可以按文本对元素进行分组,并根据该分组数据,可以得到如下输出。

var keywords = [{
    "text": "service businesses",
    "relevance": 0.626303,
    "count": 1
  },
  {
    "text": "service businesses",
    "relevance": 0.87319,
    "count": 5
  },
  {
    "text": "service businesses",
    "relevance": 0.05,
    "count": 100
  },
  {
    "text": "restaurants",
    "relevance": 0.614567,
    "count": 16
  },
  {
    "text": "restaurants",
    "relevance": 0.609875,
    "count": 4
  },
  {
    "text": "hotels",
    "relevance": 0.594905,
    "count": 1
  }
];

const groupBy = keywords.reduce((acc, cur) => {
  acc[cur.text] ? acc[cur.text] = {
    ...acc[cur.text],
    count: acc[cur.text].count + cur.count,
    relevance: [...acc[cur.text].relevance, cur.relevance]
  } : acc[cur.text] = {
    ...cur,
    relevance: [cur.relevance]
  };
  return acc;
}, {});
const output = Object.values(groupBy).map((item) => ({
  ...item,
  relevance: item.relevance.reduce((acc, cur) => acc + cur, 0) / item.relevance.length
}));
console.log(output);

【讨论】:

  • 这太完美了!非常感谢@derek.w :)
【解决方案2】:

我在两个 for 循环中运行它,然后在第二个循环中计算相关性。

我只是记录了普通对象中的值。

var keywords = [
            {
                "text": "service businesses",
                "relevance": 0.626303,
                "count": 1
            },
            {
                "text": "service businesses",
                "relevance": 0.87319,
                "count": 5
            },
            {
                "text": "service businesses",
                "relevance": 0.05,
                "count": 100
            },
            {
                "text": "restaurants",
                "relevance": 0.614567,
                "count": 16
            },
            {
                "text": "restaurants",
                "relevance": 0.609875,
                "count": 4
            },
            {
                "text": "hotels",
                "relevance": 0.594905,
                "count": 1
            }
          ]

const objectMerge = (arr) => {
  let map = {};
  for(let idx in arr){
    const { text, relevance, count } = arr[idx];
    if(!map[text]){
      map[text] = {
        count: 0,
        relevance: []
      }
    }
    map[text].count += count
    map[text].relevance.push(relevance)
  }
  for(const key in map){
    let lenOfRelevance = map[key].relevance.length
    map[key].relevance = map[key].relevance.reduce((a,b) => a+b) / lenOfRelevance
  }
  return map
}

console.log(objectMerge(keywords))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2018-11-23
    • 2016-12-15
    • 1970-01-01
    • 2018-04-27
    • 2016-04-30
    相关资源
    最近更新 更多