【问题标题】:How to access specific object from data array in JSON?如何从 JSON 中的数据数组访问特定对象?
【发布时间】:2015-08-11 04:25:28
【问题描述】:
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.(i = 4) 获得“Title3” 然后我可以通过 data[i-1].subject 获得“Title3”上一个项目,我将获得“Title2.1”。

我的问题是,有什么方法可以让我在同一个“lv”(级别)中获得上一个项目? 在英语中类似于“data[previtem in same lv]?

感谢和抱歉英语不好。

【问题讨论】:

  • 编写代码以根据该级别对数组中的对象进行排序。然后遍历处理。
  • ya..这是我的想法。我只是想确定是否有其他方法可以做到这一点
  • 如果您可以控制数据的生成方式并且级别数量有限,则另一种解决方案是为每个级别生成一个数组。然后查找上一个项目变得微不足道。

标签: javascript jquery json


【解决方案1】:

昨天看到了你之前的问题……我想如果你需要做很多次(通过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]

【讨论】:

    【解决方案2】:

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

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

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

    这还假设“前一个”的含义与 JSON 数组中呈现的顺序相同(即索引具有语义含义)。如果您打算按其他内容排序,例如 number,您可以考虑先对整个内容进行排序。

    【讨论】:

      【解决方案3】:

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

      正是iplus26 所做的。

      【讨论】:

        【解决方案4】:

        我想你想要这样的东西:

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

        【讨论】:

          【解决方案5】:

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

          另外,你可以查看这个关于过滤数据的问题:lodash Filter collection using array of values

          【讨论】:

            猜你喜欢
            • 2022-01-18
            • 1970-01-01
            • 2016-11-05
            • 1970-01-01
            • 2021-11-08
            • 2021-05-24
            • 1970-01-01
            • 2021-11-07
            • 1970-01-01
            相关资源
            最近更新 更多