用平面数组过滤JSON对象

3

我有一个JSON对象,其中包含数组对,就像这样:

Object {x: Array[36159], y: Array[36159], year: Array[36159]}

这里是一个小例子:

{
    "x": [309339618361.619, 102862032084.12102, 72892839276.09761, 46463392384.54194, -39360182208.042145],
    "y": [13950252.45052416, 1158787.402385158, -4368238.261400843, 1339913.7393283844, 2085336.6277048483],
    "year": [1991, 1991, 1992, 1992, 1992]
}

我希望能够按年份筛选此对象。如果JSON数据是数组或键值对,我可以使用filter进行筛选:

data.filter(function (x) {
    return x.year == 1991
});

但是由于JSON结构是一对扁平数组,我不知道如何处理。


期望的结果是这样的:

{
    "x": [309339618361.619, 102862032084.12102],
    "y": [13950252.45052416, 1158787.402385158],
    "year": [1991, 1991]
}

2
你收到的数据是JSON格式并不重要。假设你已经将数据解析成了JavaScript对象,那就是你正在处理的对象(参见JSON和对象字面量表示法之间有什么区别?)。 - Felix Kling
3
在这种情况下,所期望的结果是什么? - Nenad Vracar
@NenadVracar 我刚刚更新了我的问题。 - vedar
filter() 是一个数组方法,但是没有显示外部数组。 - charlietfl
data.year.filter(function (x) { return x === 1991; }); ~~ 这就是你想要做的,对吗? - user5066707
@KlaiderKlai 返回的只是年份数组,而我想要在特定年份上过滤整个对象。 - vedar
3个回答

2
您可以使用回调函数和一个包含要应用筛选器的属性的数组来进行比较。

var object = {
        "x": [309339618361.619, 102862032084.12102, 72892839276.09761, 46463392384.54194, -39360182208.042145],
        "y": [13950252.45052416, 1158787.402385158, -4368238.261400843, 1339913.7393283844, 2085336.6277048483],
        "year": [1991, 1991, 1992, 1992, 1992]
    },
    result = {};

['x', 'y', 'year'].forEach(function (p) {
    result[p] = object[p].filter(function (a, i) {
        return object.year[i] === 1991;
    });
});

console.log(result);


2
您可以使用reduce()通过要筛选的年份索引来添加值。

var obj = {
  "x": [309339618361.619, 102862032084.12102, 72892839276.09761, 46463392384.54194, -39360182208.042145],
  "y": [13950252.45052416, 1158787.402385158, -4368238.261400843, 1339913.7393283844, 2085336.6277048483],
  "year": [1991, 1991, 1992, 1992, 1992]
}

var result = obj.year.reduce(function(r, e, i) {
  if (e == 1991) {
    r.x = (r.x || []).concat(obj.x[i]);
    r.y = (r.y || []).concat(obj.y[i]);
    r.year = (r.year || []).concat(obj.year[i])
  }
  return r;
}, {});

console.log(result)


我不确定该接受哪个答案,所以我决定选择Nina的,因为她回复得最快。谢谢。 - vedar
1
不需要为每个循环检查,而且push针对一个元素进行了优化,而concat则适用于更多的元素,并且concat返回带有新项和所需赋值的整个数组。我选择使用push。 - Nina Scholz

0

只需复制obj并迭代year属性的元素,删除不等于1991的元素。

var obj = {

    x:    [309339618361.619, 102862032084.12102],
    y:    [13950252.45052416, 1158787.402385158],
    year: [1991, 1991]

},

    scan = {};

Object.assign(scan, obj);

for(var i = 0, len = scan.year.length; i < len; i ++) {

    if(scan.year[i] !== 1991) {

        scan.year.splice(i, 1);

    }

}

console.log(scan);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接