如何根据传递的值从对象中查找键值

时间:2019-05-10 14:08:36

标签: javascript arrays json search

感谢您的时间。

我在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实现最佳方法是什么,请牢记执行时间。我已经尝试过使用诸如key2indexOf之类的字符串操纵函数;但我认为不是最有效的。

TIA。

8 个答案:

答案 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.entriesObject.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.entriesArray.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'))

相关问题