获取具有多个子对象的JavaScript对象的特定值

时间:2019-08-27 12:50:05

标签: javascript node.js mongodb

我正在数据库中执行查询,该查询返回一个JavaScript对象,其中包含多个子对象。我应该找到一个特定的键值对,但是检索此数据失败。

我试图将结果推入一个空数组,如下所示:

const query = []
...
query.push(result[0].name)
query.push(result[0].token)
console.log(query)   // returns ['Walther', 'abcdef']

这很好,但是需要对所需查询进行硬编码。我想通过使用token作为整个对象中搜索查询的变量,以更动态的方式执行查询。

正在使用的对象具有以下格式:

{
 '0': 
   { token: 'abcdef', name: 'Walther' },
 '1':
   { token: 'ghijkl', name: 'Peter' },
 '2':
   { token: 'mnopqr', name: 'David' },
 '3':
   { token: 'stuvwx', name: 'Paul' },
  // etc.
}

问题是:如何在此JavaScript对象中找到特定令牌的响应值?

5 个答案:

答案 0 :(得分:1)

如果要查找与给定标记匹配的所有对象,请尝试在对象值上使用Array.prototype.filter()方法。像这样:

const obj = {
  "0": { token: "abcdef", name: "Walther" },
  "1": { token: "ghijkl", name: "Peter" },
  "2": { token: "mnopqr", name: "David" },
  "3": { token: "stuvwx", name: "Paul" }
};

const getObjectsByToken = queryToken =>
  Object.values(obj).filter(({ token }) => token === queryToken);

console.log(getObjectsByToken("abcdef"));

如果令牌是唯一的,则可以使用Array.prototype.find()方法。像这样:

const getObjectByToken = queryToken =>
  Object.values(obj).find(({ token }) => token === queryToken);

console.log(getObjectByToken("abcdef"));

如果您想玩this sandbox,则可以签出。让我知道是否有帮助。

答案 1 :(得分:0)

尝试以下代码段:

const data = {
  '0': {
    token: 'abcdef',
    name: 'Walther'
  },
  '1': {
    token: 'ghijkl',
    name: 'Peter'
  },
  '2': {
    token: 'mnopqr',
    name: 'David'
  },
  '3': {
    token: 'stuvwx',
    name: 'Paul'
  },
}

for (const [key, val] of Object.entries(data)) {
  console.log(`key: ${key} token: ${val.token}`)
}

答案 2 :(得分:0)

使用Object.values获取对象并使用查找或过滤器

var foo = {
 '0': 
   { token: 'abcdef', name: 'Walther' },
 '1':
   { token: 'ghijkl', name: 'Peter' },
 '2':
   { token: 'mnopqr', name: 'David' },
 '3':
   { token: 'stuvwx', name: 'Paul' },
  // etc.
}

// if one
const result = Object.values(foo).find(obj=>obj.token === 'mnopqr')
console.log(result)

//if multiple, use filter
const result2 = Object.values(foo).filter(obj=>obj.token === 'mnopqr')
console.log(result2)

答案 3 :(得分:0)

如果您想将此Object转换成Array形式,则只需使用Object.keys()map()

const getArray = (obj) => {
  const array = Object.keys(obj).map((r) => { return obj[r]; });
  return array;
};

const object = {
  0:
    { token: 'abcdef', name: 'Walther' },
  1:
    { token: 'ghijkl', name: 'Peter' },
  2:
    { token: 'mnopqr', name: 'David' },
  3:
    { token: 'stuvwx', name: 'Paul' },
};

const result = getArray(object);
console.log(result); 

如果您想基于filter应用token,那么filter()将为您提供帮助。

     const filterWithToken = (obj, token) => {
       const array = Object.keys(obj)
         .map((m) => { return obj[m]; })
         .filter((r) => { return r.token && (r.token === token); });
       return array; 
     }; 
 
const object = {
  0:
    { token: 'abcdef', name: 'Walther' },
  1:
    { token: 'ghijkl', name: 'Peter' },
  2:
    { token: 'mnopqr', name: 'David' },
  3:
    { token: 'stuvwx', name: 'Paul' },
};

const result = filterWithToken(object, 'ghijkl');
console.log(result); 

答案 4 :(得分:0)

有多个选项:

// You can find query in the object by key

const requiredToken = <some token>;

const query = Object.keys(obj)
  .find((key) => obj[key]token === requiredToken);

// OR you can transform your data into array

const dataArray = Object.values(obj)

const query = dataArray.find((value) => value.token === requiredToken);

// OR you can transform you data into something more convenient

const transformedData = Object.keys(obj).reduce((transformedData, key) => {
    const value = obj(key);

    transformedData[value.token] = value;

    return transformedData;
}, {});

const query = transformedData[requiredToken];