首页 > 解决方案 > 过滤嵌套的 JSON

问题描述

我有一个结构如下的 JSON 对象:

var x = {
zy5EwY0caL3rPk4PXyX3: { name: 'Bob', completedDate: '2019-03-27T01:56:27.589Z'},
zy4HsKbHYZKtZNBMHdxu: { name: 'Tom', completedDate: '2019-04-10T01:56:27.589Z'},
zy0VPwMY51ksZaTFFIxL: { name: 'Jim', completedDate: '2019-05-01T01:56:27.589Z'},
zw6Xmv5PiNE4dmC19q2p: { name: 'Joe', completedDate: '2019-05-02T01:56:27.589Z'}
}

我想在节点脚本中运行一些 javascript 来过滤并仅返回完成数据在过去 10 天内的对象并返回以下内容。

var filteredData = {
zy0VPwMY51ksZaTFFIxL: { name: 'Jim', completedDate: '2019-05-01T01:56:27.589Z'},
zw6Xmv5PiNE4dmC19q2p: { name: 'Joe', completedDate: '2019-05-02T01:56:27.589Z'}
}

我遇到了问题,因为数据是嵌套的。我试过在下划线中使用 .where 函数,但我不知道让它检查嵌套元素的语法。

有没有一种简单的方法可以得到我想要的?

标签: javascriptjson

解决方案


因为您的源数据不是数组,所以不能使用Array.filter.

所以你可以做的是使用Object.entries迭代然后放入另一个对象。

下面是一个简单的例子。

const x = {
zy5EwY0caL3rPk4PXyX3: { name: 'Bob', completedDate: '2019-03-27T01:56:27.589Z'},
zy4HsKbHYZKtZNBMHdxu: { name: 'Tom', completedDate: '2019-04-10T01:56:27.589Z'},
zy0VPwMY51ksZaTFFIxL: { name: 'Jim', completedDate: '2019-05-01T01:56:27.589Z'},
zw6Xmv5PiNE4dmC19q2p: { name: 'Joe', completedDate: '2019-05-02T01:56:27.589Z'}
};

const day = 1000 * 60 * 60 * 24;
//const now = Date.now();
//let's set a date time, so snippet will continue to work
//in the future, but Date.now() would be use
//for current time
const now = new Date("2019-05-08T14:29:27.589Z");

const ret = {};
for (const [k, v] of Object.entries(x)) {
  const tmc = new Date(v.completedDate);
  const diff = Math.abs(tmc.getTime() - now);
  if (diff < 10 * day) ret[k] = v;
}

console.log(ret);


推荐阅读