将数组中的多个 JSON 个对象合并在一起

Merging multiple JSON objects from an array together

我有一个 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
            },

我试过 但是,我得到的输出是这样的:

{
    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
            },

非常感谢任何帮助!

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

我运行它在两个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))