当前位置: 首页 > 知识库问答 >
问题:

过滤嵌套对象Javascript

竺辉
2023-03-14

我知道类似的问题,如这里,但我不知道什么应该是一个容易的问题。我正在尝试过滤对象中的一个对象的真实值。

const obj = {
  piano: {
    scales: { essential: 1 },
    chords: { essential: 1 },
    triads: { essential: 0 },
  },
  bass: { scales: { essential: 1 }, triads: { essential: 0 } },
};
function getEssential(state) {
  return Object.fromEntries(
    Object.entries(state).filter(([, val]) => val.essential)
  );
}

const resOne = Object.fromEntries(
  Object.entries(obj.piano).filter(([, val]) => val.essential)
);

const resTwo = Object.keys(obj).forEach((el) =>
  Object.entries(obj[el]).filter(([, val]) => val.essential)
);

const resThree = Object.keys(obj).forEach((el) => getEssential(el));

console.log(resOne);
console.log(resTwo);
console.log(resThree);

请看到resOne给出了所需的输出,但只针对一个键(在本例中为piano)。我知道我可以创建一个空数组,并将通过测试的数组相加,但必须有一个更有效的方法。

如何获取一个对象,循环遍历所有键,应用过滤器并返回相同的对象减去属性essential!==1?

电流输出:

{ scales: { essential: 1 }, chords: { essential: 1 } }
undefined
undefined

共有3个答案

钱凌
2023-03-14

您可以使用具有for.。。in循环的递归方法来实现这一点,并且只有在某个级别上找到属性entials:1时才向结果添加属性。

null

const obj = {
  piano: { scales: { essential: 1 }, chords: { essential: 1 }, triads: { essential: 0 } },
  bass: { scales: { essential: 1 }, triads: { essential: 0 } },
};

function filter(obj) {
  const result = {}

  for (let i in obj) {
    if (typeof obj[i] === 'object') {
      const val = filter(obj[i])

      if (val) {
        result[i] = val;
      }
    } else {
      if (i === 'essential' && obj[i] != 1) {
        return false
      } else {
        result[i] = obj[i]
      }
    }
  }

  return result;
}

console.log(filter(obj))
宗项禹
2023-03-14
  • 使用object.entrimes,您可以获取每个子对象值,并可以使用array.filter获取筛选的条目。
  • 之后,使用object.fromentries,您可以从筛选的条目重新生成对象

null

const obj = {
  piano: {
    scales: { essential: 1 },
    chords: { essential: 1 },
    triads: { essential: 0 },
  },
  bass: { scales: { essential: 1 }, triads: { essential: 0 } },
};

const getEssentials = (obj) => {
  const result = {};
  const keys = Object.keys(obj);
  keys.forEach(key => {
    var entries = Object.entries(obj[key]).filter(([subKey, subValue]) => subValue.essential);
    result[key] = Object.fromEntries(entries);
  });
  
  return result;
};

console.log(getEssentials(obj));
贺景铄
2023-03-14

您需要对嵌套条目使用嵌套方法。

null

function getEssential(state) {
    return Object.fromEntries(Object
        .entries(state)
        .map(([k, v]) => [k, Object.fromEntries(Object.entries(v).filter(([, val]) => val.essential))])
    );
}

const obj = {
  piano: {
    scales: { essential: 1 },
    chords: { essential: 1 },
    triads: { essential: 0 },
  },
  bass: { scales: { essential: 1 }, triads: { essential: 0 } },
};

console.log(getEssential(obj));
 类似资料:
  • 问题内容: 我有这样的角度嵌套对象。有没有办法为嵌套属性过滤它 我只显示父元素,但想按两个元素进行过滤,例如: 问题答案: 是的,如果我正确理解您的示例,则可以。 根据集合的大小,计算迭代所用的集合可能会更好,这样过滤器就不会随着模型的更改而不断地进行操作。 http://jsfiddle.net/suCWn/ 基本上,如果我理解正确,您会执行以下操作:

  • 问题内容: 使用嵌套对象的布尔运算符时遇到一些麻烦。这是我的映射: 我想获取恰好包含两个指定ip甚至更多的文档。 假设我的文档具有以下ips: 我想通过使用此过滤器进行搜索来仅检索DOC 1: 问题在于,同时检索了DOC 1和DOC2。 问题答案: 你可以使用你的条件过滤器是这样的: 这是我用来测试的一些代码: http://sense.qbox.io/gist/d6b5f4e4c0d2977a0

  • 我有一个映射: 我使用三个条件进行筛选: “日志类型”是“爬虫” “2020-05-23”上的“创建数据” “resp”的大小=0 我试图过滤与查询: {"查询":{"bool":{"必须":[{"术语":{"_logType":{"value":"爬虫"}}},{"范围":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zon

  • 设备类型.java DeviceTelemetry.java (枚举类) 我想获取所有DeviceType Id,它们的DeviceTelem计名称以“System”(String)开头。 我做了这样的事情:— 谁能告诉我如何从中获取DeviceType Id?

  • 问题内容: 我的映射是: 我想获取所有没有字段的文档。 我试过了: 返回所有文档。基于ElasticSearch2.x,存在用于嵌套字段的过滤器不起作用的问题,我也尝试过: 返回0个文档。 使所有缺少该字段的文档的正确查询是什么? 问题答案: 我找到了正确的语法,应该是:

  • 我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。 下面是一个例子: 当在地址中搜索时,理想情况下,我应该只获得带有一个嵌套对象的,但我会获得所有嵌套对象。如何筛选返回的嵌套对象? 示例查询: 该查询的输出是和所有员工,而我只想要。

  • 感谢您的回复 编辑: 我试图计数对象之间指定日期范围内的筛选器内的嵌套对象。在ElasticSearch上这样做可能吗?简单地说,我想查看,客户谁有1个订单或多个订单取决于输入在一个指定的日期。 我知道如何获得客户的每日计数,但如果我想计数在指定日期范围内有1个订单的客户在一组每日报表中怎么办? 我所期望的可能的回应:

  • 问题内容: 我在ng-table中有一张发票清单,希望能够对嵌套属性进行过滤。json看起来像这样; 我的看法是这样的 我想让过滤工作于client.fullname。如何过滤嵌套属性? 更新资料 我找到了一种解决方法,将嵌套字段放入非嵌套的JSON元素中,在上面的示例中,我创建了一个JSON [‘client_name’]元素并将其分配给rails模型中的client.fullname。然后,筛