从JSON中获取重复的对象键的值,并只用一个键替换返回。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从JSON中获取重复的对象键的值,并只用一个键替换返回。相关的知识,希望对你有一定的参考价值。

我想知道如何从JSON中获取重复的对象键的值并替换成其他对象键中唯一的一个,最后以数组形式返回。

注意:这是一个从JSON中返回的数据。 这是从JSON结果中返回的数据。

例子如下。

const obj = { id: 71, books: 'Things fall apart' }
{ id: 71, books: 'The Namesake' }
{ id: 71, books: 'The Secret Life of Bees' }
{ id: 417, books: 'The Namesake' }
{ id: 417, books: 'State of Wonder' }
{ id: 22, books: "Americanah" }
{ id: 22, books: 'Things fall apart' }

得到上述数据后,我的想法是什么?

[
  {
    "id": 71,
    "books": [
      "Things fall apart",
      "The Namesake",
      "The Secret Life of Bees"
    ]
  },
  {
    "id": 417,
    "books": [
      "The Namesake",
      "State of Wonder"
    ]
  },
  {
    "id": 22,
    "books": [
      "Americanah",
      "Things fall apart"
    ]
  }
]

谢谢你帮我解决这个问题。

答案

你可以尝试用 reducefindIndex:

const arr = [
	{ id: 71, books: 'Things fall apart' },
	{ id: 71, books: 'The Namesake' },
	{ id: 71, books: 'The Secret Life of Bees' },
	{ id: 417, books: 'The Namesake' },
	{ id: 417, books: 'State of Wonder' },
	{ id: 22, books: "Americanah" },
	{ id: 22, books: 'Things fall apart' }
];

const res = arr.reduce((a, {id, books}) => {
    const index = a.findIndex(item => item.id === id);

    if (index === -1) {
	a.push({id, books: [books]});
    } else {
	a[index].books.push(books);
    }

    return a;
}, []);

console.log(res);
.as-console-wrapper{min-height: 100%!important; top: 0;}
另一答案

嗨 @Stan50 欢迎来到Stack Overflow。

      const arrayUnique = Array.from(
        obj
          .reduce(
            (acc, item) => (
              acc.set(item['id'], item)
            ),
            new Map()
          )
          .values()
      );


reduce()方法执行一个reducer函数,它在数组中的每个元素上执行。我们有累加器(acc)和当前值(item)。我们的reducer函数返回的值被分配给累加器(在这种情况下,我们有italValue,这是new Map(),所以当回调被调用时,这将是第一个),然后我们设置(acc.set(item['id'],item)=>对于这个id,我们设置current item),这个累加器在整个数组的每次迭代中都会被记住.使用Map是很重要的,因为它保存了顺序.而在最后,你使用Values,只得到对象和Array.from,从这些唯一的由id对象创建一个数组。

另一答案

你是说obj是一个数组?最好取个类似于 records. 还有: books 应名 bookbookName 因为它不是一个数组!

总之,你可以用 减少找到 如下图所示。

const result = obj.reduce((accumulator, record) => {
    const { id, books } = record;
    const existingRecord = accumulator.find(storedRecord => storedRecord.id === id);
    if (existingRecord) {
        existingRecord.books.push(books);
    } else {
        accumulator.push({id, books: [books]});
    }
    return accumulator;
}, []);

console.log(result);

以上是关于从JSON中获取重复的对象键的值,并只用一个键替换返回。的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中完全获取带有重复键的JSON

NodeJS通过键的值在数组中查找对象[重复]

如何从 Javascript 中的对象列表中获取键的值?

如何从自定义模型对象数组中获取特定键的值

mySQL中的JSON操作

从数组中的所有对象中获取特定键的值