感谢您的时间。
我在JavaScript中具有以下对象:
import pandas as pd
import json
from pandas.io.json import json_normalize
src_json = "C:/Users/name/Documents/Filename.json"
tgt_csv = "C:/Users/name/Documents/Filename.csv"
jfile = open(src_json)
jdata = json.load(jfile)
...rest of the code...
```python
现在,我想解析一个特定的值,如果该值存在,我想返回与其关联的键。假设我传递的是'value3',它应该返回{
"key1":"value1,value2,value3",
"key2":"value4,value5,value6"
}
;如果通过key1
,它将返回我value5
,依此类推。
使用Javascript实现最佳方法是什么,请牢记执行时间。我已经尝试过使用诸如key2
,indexOf
之类的字符串操纵函数;但我认为不是最有效的。
TIA。
答案 0 :(得分:2)
对我来说,最快,最简洁的方法是对源对象Array.prototype.find()
抛出的String.prototype.includes()
和entries的组合:
const src={"key1":"value1,value2,value3","key2":"value4,value5,value6"};
const getAkey = (obj, val) => (Object.entries(obj).find(entry => entry[1].split(',').includes(val)) || ['no match'])[0];
console.log(getAkey(src, 'value1'));
console.log(getAkey(src, 'value19'));
ps ,而filter()
或reduce()
或forEach()
将遍历整个数组,而find()
会在找到后立即停止比赛,所以,如果表现很重要,我会坚持使用后者
答案 1 :(得分:2)
这里的方法稍有不同,它将生成一个映射,其中的键实际上是原始values
对象的值。
生成的地图将是一种快速查找。只是为了清楚起见,只要您需要进行大量查找,此解决方案就是有效的。对于单个唯一查找,此解决方案效率较低,因为构建哈希图比查找单个值需要更多时间。
但是,一旦地图准备就绪,通过键获取值的速度将非常快,因此,如果需要以后获取多个值,此解决方案将更适合于使用情况。
这可以使用Object.entries
和Object.values
完成。下面的代码中提供了进一步的说明。
下面的代码(尽管不是必需的)也将避免在限制情况下避免indexOf
,例如在'value9999'上搜索'value9',而在常规字符串上实际上可以使用indexOf。
const values = {
"key1":"value1,value2,value3",
"key2":"value4,value5,value6",
"key3":"value444,value129839,value125390", // <-- additional test case.
"key4": "value9" // <-- additional test case.
};
const map = Object.entries(values).reduce((acc, [key, value]) => {
// If the value is invalid, return the accumulator.
if (!value) return acc;
// Otherwise, split by comma and update the accumulator, then return it.
return value.split(',').forEach(value => acc[value] = key), acc;
}, {});
// Once the map is ready, you can easily check if a value is somehow linked to a key:
console.log(map["value444"]); // <-- key 3
console.log(map["value9"]); // <-- key 4
console.log(map["Hello!"]); // undefined
答案 2 :(得分:1)
根据您的搜索,您可以在遍历对象后使用indexOf
。
这是一种古老的方法:
var obj = {
"key1":"value1,value2,value3",
"key2":"value4,value5,value6"
}
function search (str) {
for (var key in obj) {
var values = obj[key].split(',');
if (values.indexOf(str) !== -1) return key
}
return null;
}
console.log(search('value1'))
console.log(search('value6'))
或者您可以将Object.keys()
与filter()
方法一起使用,并获取返回数组的索引0。
var obj = {
"key1":"value1,value2,value3",
"key2":"value4,value5,value6"
}
function search (str) {
return Object.keys(obj).filter((key) => {
const values = obj[key].split(',');
if (values.indexOf(str) !== -1) {
return key
}
})[0]
}
console.log(search('value1'))
console.log(search('value6'))
答案 3 :(得分:1)
您可以尝试遍历对象中的每个值,然后在每个逗号上分割该值,然后像下面这样检查该值是否在返回的数组中:
const myObj = {"key1":"value1,value2,value3","key2":"value4,value5,value6"}
function findKeyByValue(obj, value) {
for (var key in myObj) {
const valuesArray = myObj[key].split(',')
if (valuesArray.includes(value)) {
return key
}
}
}
const key = findKeyByValue(myObj, 'value5') // returns 'key2'
console.log(key)
编辑:更改了循环以提高效率,并提取了功能代码
答案 4 :(得分:0)
将Object.entries
与Array.prototype.filter
结合使用以获取所需的密钥。
const data = {
"key1": "value1,value2,value3",
"key2": "value4,value5,value6"
};
const searchStr = 'value3';
const foundProp = Object.entries(data).filter(x => x[1].indexOf(searchStr) !== -1);
let foundKey = '';
if (foundProp && foundProp.length) {
foundKey = foundProp[0][0];
}
console.log(foundKey);
答案 5 :(得分:0)
Lodash为此具有一个名为findKey的函数,该函数接受对象,并具有确定真实性的函数:
obj = { 'key1': 'value1, value2, value3', 'key2': 'value4,value5,value6' }
_.findKey(obj, val => val.includes('value3'))
# 'key1'
_.findKey(obj, val => val.includes('value5'))
# 'key2'
答案 6 :(得分:0)
这应该做到。只需使用Object.entries和过滤器来查找包含您要查找的值的条目。 (也可以找到具有所需值的多个对象)
var obj = {
"key1": "value1,value2,value3",
"key2": "value4,value5,value6"
};
var find = 'value2';
var key = Object.entries(obj).filter(([k, v]) => v.split(',').includes(find))[0][0];
console.log(key);
可能想要在尝试访问Object.entries(obj).filter((o) => o[1].split(',').includes(find))
的返回值之前进行检查,以防它不返回任何内容。像这样:
var obj = {
"key1": "value1,value2,value3",
"key2": "value4,value5,value6"
};
function findKey(objectToSearch, valueToFind) {
var res = Object.entries(objectToSearch).filter(([key, value]) => value.split(',').includes(valueToFind));
if(res.length > 0 && res[0].length > 0) {
return res[0][0];
}
return false;
}
console.log(findKey(obj, 'value5'));
答案 7 :(得分:0)
includes可用于检查数组中是否存在值。 Object.keys可用于迭代和检查匹配项。
function findKey(json, searchQuery) {
for (var key of Object.keys(json)) if (json[key].split(',').includes(searchQuery)) return key;
}
const json = {
"key1": "value1,value2,value3",
"key2": "value4,value5,value6"
}
console.log(findKey(json, 'value5'))