如何从JSON中的数据数组访问特定对象?

时间:2015-08-11 04:25:28

标签: javascript jquery json

data: [
  {
    cid: "211211",
    parentCid: "212121",
    level: 3,
    number: "2.1.1",
    subject: "Title 2.1.1"
  },
  {
    cid: "111111",
    parentCid: "",
    lv: 1,
    number: "1",
    subject: "Title1"
  },
  {
    cid: "222222",
    parentCid: "",
    lv: 1,
    number: "2",
    subject: "Title2"
  },
  {
    cid: "212121",
    parentCid: "222222",
    lv: 2,
    number: "2.1",
    subject: "Title2.1"
  },
  {
    cid: "333333",
    parentCid: "",
    lv: 1,
    number: "3",
    subject: "Title3"
  }
]

我有一个像上面这样的json数据,我可以通过data [i] .subject得到主题。

例如,我可以通过data [i] .subject得到“Title3”。(i = 4) 然后我可以通过data [i-1] .subject得到“Title3”上一项,我将获得“Title2.1”。

我的问题是,有什么方法可以获得相同的“lv”(级别)中的上一项? 在英语中是“数据[在同一个lv中的主流]?

感谢并抱歉英语不好。

5 个答案:

答案 0 :(得分:2)

我昨天看到你之前的问题...我想如果你需要这么做(多次按level搜索spec元素),你应该对数组进行排序。或者你只需​​要做几次,你只需要一个循环来找到你想要的前一个元素。

这样一个简单的方法:

function findPrev(i) {
    var level = data[i--].lv;
    while (i >= 0) {
        if (data[i].lv === level) return i;
        i--;
    }

    return -1;  // not found
}

参见完整演示:

var data = [
    {
        cid: "211211",
        parentCid: "212121",
        lv: 3,
        number: "2.1.1",
        subject: "Title 2.1.1"
    },
    {
        cid: "111111",
        parentCid: "",
        lv: 1,
        number: "1",
        subject: "Title1"
    },
    {
        cid: "222222",
        parentCid: "",
        lv: 1,
        number: "2",
        subject: "Title2"
    },
    {
        cid: "212121",
        parentCid: "222222",
        lv: 2,
        number: "2.1",
        subject: "Title2.1"
    },
    {
        cid: "333333",
        parentCid: "",
        lv: 1,
        number: "3",
        subject: "Title3"
    }
];

function findPrev(i) {
    var level = data[i--].lv;
    while (i >= 0) {
        if (data[i].lv === level) return i;
        i--;
    }

    return -1;  // not found
}

console.log(data[findPrev(4)]); // data[4] go find data[2]

答案 1 :(得分:1)

我假设您已经拥有“当前项目”的索引i,或者知道如何获得它。在这种情况下,一个天真的方法是从循环中的当前项向后移动,比较lv

var previousItemIndex = i - 1;

while(previousItemIndex >= 0 && data[i].lv !== data[previousItemIndex].lv)
    previousItemIndex--;

这将从i向后遍历数组,找到具有匹配lv属性的第一个元素,如果不存在则返回-1。

这也假定“previous”意味着与JSON数组中呈现的顺序相同(即索引具有语义含义)。如果您打算按其他内容订购,例如number,您可以考虑先对整个事项进行排序。

答案 2 :(得分:1)

LateBloomer,您问题的答案很简单。要找到具有相同级别的前一个元素,您需要做的就是减少" i "并检查水平是否相同。如果没有,那么再次减少。

iplus26完全是什么。

答案 3 :(得分:0)

我想你想要这样的东西:

function prevItemSameLv(data, i) {
    for (var idx=i-1; idx>=0; idx--) {
        if (data[idx].lv == data[i].lv) return data[idx];
    }
}

答案 4 :(得分:0)

你可以使用像_lodash这样的库,它有一个名为“findIndex”的函数,在这里阅读更多:https://lodash.com/docs#findIndex但它只返回一个值。

此外,您可以查看有关过滤数据的问题:lodash Filter collection using array of values