Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JSON中查找具有特定值的多个文档_Javascript_Json - Fatal编程技术网

Javascript 在JSON中查找具有特定值的多个文档

Javascript 在JSON中查找具有特定值的多个文档,javascript,json,Javascript,Json,我有一个复杂的JSON,如下所示: { "a": { "b": { "c": { "price": { "type": "coin", "value": "currency" } } } }, "e": { "f": { "price": { "type": "note", "value": "currency"

我有一个复杂的JSON,如下所示:

{
  "a": {
    "b": {
      "c": {
        "price": {
          "type": "coin",
          "value": "currency"
        }
      }
    }
  },
  "e": {
    "f": {
      "price": {
        "type": "note",
        "value": "currency"
      }
    }
  },
  "price": {
    "type": "cents",
    "value": "dollars"
  }
}
"g": {
  "price": {
    "type": "coin",
    "value": "dollars"
  }
}
我正在尝试编写一个JavaScript函数,该函数将在任何位置查找“price”,并为其提取“type”和“value”。因此,我的输出应该是:

"coin" : "currency"
"note" : "currency"
"cents" : "dollars"

您可以使用循环中的for…创建递归函数,从而返回对象

const data={“a”:{“b”:{“c”:{“price”:{“type”:“coin”,“value”:“currency”}}},“e”:{“f”:{“price”:{“type”:“note”,“value”:“currency”}}},“price”:{“type”:“cents”,“value”:“dollars”}}
函数getPrice(数据){
常量结果={}
for(让我输入数据){
if(type of data[i]=“object”)object.assign(result,getPrice(data[i]))
如果(i==“price”)Object.assign(结果{
[数据[i].类型]:数据[i].值
})
}
返回结果;
}
const result=getPrice(数据);

console.log(result)
您可以在循环中为…创建递归函数,以返回对象作为结果

const data={“a”:{“b”:{“c”:{“price”:{“type”:“coin”,“value”:“currency”}}},“e”:{“f”:{“price”:{“type”:“note”,“value”:“currency”}}},“price”:{“type”:“cents”,“value”:“dollars”}}
函数getPrice(数据){
常量结果={}
for(让我输入数据){
if(type of data[i]=“object”)object.assign(result,getPrice(data[i]))
如果(i==“price”)Object.assign(结果{
[数据[i].类型]:数据[i].值
})
}
返回结果;
}
const result=getPrice(数据);
log(result)
您需要递归(或不递归)迭代对象的属性。 以下是一些老式javascript:

const testObj={
“a”:{
“b”:{
“c”:{
“价格”:{
“类型”:“硬币”,
“价值”:“货币”
}
}
}
},
“e”:{
“f”:{
“价格”:{
“类型”:“注释”,
“价值”:“货币”
}
}
},
“价格”:{
“类型”:“分”,
“价值”:“美元”
}
};
功能金融机构(accum、obj、prop){
if(对象拥有自己的财产(财产)){
累计推力(obj[prop]);
}
用于(obj中的var p){
如果(对象hasOwnProperty(p)&&p!==prop)
金融机构(accum、obj[p]、prop);
}
}
累计风险值=[];
金融产品(累计、测试、价格);
控制台日志(accum)您需要递归(或不递归)迭代对象的属性。
以下是一些老式javascript:

const testObj={
“a”:{
“b”:{
“c”:{
“价格”:{
“类型”:“硬币”,
“价值”:“货币”
}
}
}
},
“e”:{
“f”:{
“价格”:{
“类型”:“注释”,
“价值”:“货币”
}
}
},
“价格”:{
“类型”:“分”,
“价值”:“美元”
}
};
功能金融机构(accum、obj、prop){
if(对象拥有自己的财产(财产)){
累计推力(obj[prop]);
}
用于(obj中的var p){
如果(对象hasOwnProperty(p)&&p!==prop)
金融机构(accum、obj[p]、prop);
}
}
累计风险值=[];
金融产品(累计、测试、价格);

控制台日志(accum)
您可以检查想要的键
price
,并获取新对象的
type
value
,或者深入查看

功能平面(对象){
返回对象。条目(对象)。减少(
(r[k,v])=>Object.assign(r,k=='price'?{[v.type]:v.value}:flat(v)),
{}
);
}
var object={a:{b:{c:{price:{type:“coin”,value:“currency”}}}},e:{f:{price:{type:“note”,value:“currency”}},price:{type:“cents”,value:“dollars”};

控制台日志(平面(对象))
您可以检查想要的键
price
,并获取新对象的
type
value
,或者深入查看

功能平面(对象){
返回对象。条目(对象)。减少(
(r[k,v])=>Object.assign(r,k=='price'?{[v.type]:v.value}:flat(v)),
{}
);
}
var object={a:{b:{c:{price:{type:“coin”,value:“currency”}}}},e:{f:{price:{type:“note”,value:“currency”}},price:{type:“cents”,value:“dollars”};

控制台日志(平面(对象))虽然其他答案很好,但它们不允许同一个键有不同的值。例如,如果您有这样的附加价格:

{
  "a": {
    "b": {
      "c": {
        "price": {
          "type": "coin",
          "value": "currency"
        }
      }
    }
  },
  "e": {
    "f": {
      "price": {
        "type": "note",
        "value": "currency"
      }
    }
  },
  "price": {
    "type": "cents",
    "value": "dollars"
  }
}
"g": {
  "price": {
    "type": "coin",
    "value": "dollars"
  }
}
它将用其他答案覆盖
硬币的第一个值,您将得到:

{
  "coin": "dollars",
  "note": "currency",
  "cents": "dollars"
}
如果您有这种情况,并且希望获得
硬币的两个不同值,则需要为每个键/值使用单独的对象,而不是将它们作为单个对象的属性:

var json={
“a”:{
“b”:{
“c”:{
“价格”:{
“类型”:“硬币”,
“value”:“货币”
}
}
}
},
“e”:{
“f”:{
“价格”:{
“类型”:“注释”,
“价值”:“货币”
}
}
},
“价格”:{
“类型”:“分”,
“价值”:“美元”
},
“g”:{
“价格”:{
“类型”:“硬币”,
“价值”:“美元”
}
}
};
函数getPrice(数据){
var结果=[];
for(让我输入数据){
如果(i=“价格”)
结果:推({
[数据[i].类型]:数据[i].值
});
else if(数据类型[i]=“对象”)
结果推送(getPrice(数据[i])[0]);
}
返回结果;
}
var-price=getPrice(json);

console.log(price)
虽然其他答案很好,但它们不允许同一个键有不同的值。例如,如果您有这样的附加价格:

{
  "a": {
    "b": {
      "c": {
        "price": {
          "type": "coin",
          "value": "currency"
        }
      }
    }
  },
  "e": {
    "f": {
      "price": {
        "type": "note",
        "value": "currency"
      }
    }
  },
  "price": {
    "type": "cents",
    "value": "dollars"
  }
}
"g": {
  "price": {
    "type": "coin",
    "value": "dollars"
  }
}
它将用其他答案覆盖
硬币的第一个值,您将得到:

{
  "coin": "dollars",
  "note": "currency",
  "cents": "dollars"
}
如果您有这种情况,并且希望获得
硬币的两个不同值,则需要为每个键/值使用单独的对象,而不是将它们作为单个对象的属性:

var json={
“a”