首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在多个json结构中按键搜索多个元素

在多个json结构中按键搜索多个元素
EN

Stack Overflow用户
提问于 2021-10-13 07:53:27
回答 3查看 562关注 0票数 0

我需要获得与items键匹配的所有数组的值。我正在用Javascript编写一个脚本,它需要在多个 json 文件中读取多个items数组中的对象,但是每个json都有一个不同的结构。示例:

file1.json:

代码语言:javascript
代码运行次数:0
运行
复制
{
   "name":"First file",
   "randomName3874":{
      "items":[
         {
            "name":"item1"
         }
      ]
   },
   "items":[
      {
         "name":"randomItem2"
      }
   ]
}

file2.json

代码语言:javascript
代码运行次数:0
运行
复制
{
   "name":"Another file",
   "randomName00000":{
      "nestedItems":{
         "items":[
            {
               "name":"item87"
            }
         ]
      }
   },
   "stuff":{
      "items":[
         {
            "name":"randomItem35"
         }
      ]
   }
}

期望的结果:

代码语言:javascript
代码运行次数:0
运行
复制
{
   "data":[
      {
         "items":[
            {
               "name":"item1"
            }
         ]
      },
      {
         "items":[
            {
               "name":"randomItem2"
            }
         ]
      },
      {
         "items":[
            {
               "name":"item87"
            }
         ]
      },
      {
         "items":[
            {
               "name":"randomItem35"
            }
         ]
      }
   ]
}

在这两个文件中,我希望提取具有键items的数组。在上面的例子中,脚本应该找到4个数组。正如您在这两个文件中看到的那样,每个数组都是不同的嵌套。我如何使用Javascript来完成这个任务呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-13 08:14:30

这样可以做到:

代码语言:javascript
代码运行次数:0
运行
复制
function omit(key, obj) {
  const { [key]: omitted, ...rest } = obj;
  return rest;
}

function getItems(obj) {
  return (typeof obj === 'object'
    ? 'items' in obj
      ? [{ items: obj.items }].concat(getItems(omit('items', obj)))
      : Object.values(obj).map(v => getItems(v))
    : []
  ).flat()
}
console.log({
  data: [file1, file2].map(o => getItems(o)).flat()
})

看到它起作用:

代码语言:javascript
代码运行次数:0
运行
复制
const file1 = {
   "name":"First file",
   "randomName3874":{
      "items":[
         {
            "name":"item1"
         }
      ]
   },
   "items":[
      {
         "name":"randomItem2"
      }
   ]
}
const file2 = {
   "name":"Another file",
   "randomName00000":{
      "nestedItems":{
         "items":[
            {
               "name":"item87"
            }
         ]
      }
   },
   "stuff":{
      "items":[
         {
            "name":"randomItem35"
         }
      ]
   }
}

function omit(key, obj) {
  const { [key]: omitted, ...rest } = obj;
  return rest;
}

function getItems(obj) {
  return (typeof obj === 'object'
    ? 'items' in obj
      ? [{ items: obj.items }].concat(getItems(omit('items', obj)))
      : Object.values(obj).map(v => getItems(v))
    : []
  ).flat()
}
console.log({
  data: [file1, file2].map(o => getItems(o)).flat()
})

让我们更进一步,将其泛化(使用对象数组并提取任何键),并将其作为一个函数提供,您也可以在其他项目中使用该函数:

代码语言:javascript
代码运行次数:0
运行
复制
function extractKey(objects, key) {
  const omit = (key, obj) => {
    const { [key]: omitted, ...rest } = obj;
    return rest;
  }

  const getValues = (obj) => (typeof obj === 'object'
    ? key in obj
      ? [{ [key]: obj[key] }].concat(getValues(omit(key, obj)))
      : Object.values(obj).map(o => getValues(o))
    : []
  ).flat();
  
  return objects.map(o => getValues(o)).flat()
}

// use: 
extractKey([file1, file2], 'items');

看到它起作用:

代码语言:javascript
代码运行次数:0
运行
复制
function extractKey(objects, key) {
  const omit = (key, obj) => {
    const { [key]: omitted, ...rest } = obj;
    return rest;
  }

  const getValues = (obj) => (typeof obj === 'object'
    ? key in obj
      ? [{ [key]: obj[key] }].concat(getValues(omit(key, obj)))
      : Object.values(obj).map(o => getValues(o))
    : []
  ).flat();
  
  return objects.map(o => getValues(o)).flat()
}

// test:

const file1 = {
   "name":"First file",
   "randomName3874":{
      "items":[
         {
            "name":"item1"
         }
      ]
   },
   "items":[
      {
         "name":"randomItem2"
      }
   ]
}
const file2 = {
   "name":"Another file",
   "randomName00000":{
      "nestedItems":{
         "items":[
            {
               "name":"item87"
            }
         ]
      }
   },
   "stuff":{
      "items":[
         {
            "name":"randomItem35"
         }
      ]
   }
}


console.log(
  { data: extractKey([file1, file2], 'items') }
)

票数 2
EN

Stack Overflow用户

发布于 2021-10-13 08:27:02

像树嵌套循环那样循环应该可以做到。

代码语言:javascript
代码运行次数:0
运行
复制
let file1 = {
    "name": "First file",
    "randomName3874": {
        "items": [
            {
                "name": "item1"
            }
        ]
    },
    "items": [
        {
            "name": "randomItem2"
        }
    ]
}

let file2 = {
    "name": "Another file",
    "randomName00000": {
        "nestedItems": {
            "items": [
                {
                    "name": "item87"
                }
            ]
        }
    },
    "stuff": {
        "items": [
            {
                "name": "randomItem35"
            }
        ]
    }
}

let itemsValues = [];
let desiredKey = 'items'

let loop = (value) => {
    if (Array.isArray(value)) { 
        value.forEach(loop);
    } else if (typeof value === 'object' && value !== null) {
        Object.entries(value).forEach(([key, val]) => (key === desiredKey) ? itemsValues.push({ [desiredKey]:  val }) : loop(val));
    }
}

loop(file1);
loop(file2);

console.log(itemsValues);

票数 0
EN

Stack Overflow用户

发布于 2021-10-13 09:21:21

这应该是可行的:

代码语言:javascript
代码运行次数:0
运行
复制
function getIdInObjects(id, objects, output = { data: [] }) {
  if (id in objects) output.data.push({[id]: objects[id]});

  for (const key in objects) {
    if (typeof(objects[key]) === 'object') getIdInObjects(id, objects[key], output);
  }
  return output;                                                                                                                                                                                                                         
}
console.log('items', [object1, object2])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69551651

复制
相关文章

相似问题

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