【问题标题】:Array element comparison with Json response in JavascriptJavascript中的数组元素与Json响应的比较
【发布时间】:2020-01-08 17:57:31
【问题描述】:

我有一个像这样的 Json 响应。

[
  {
    "name": "name1",
    "id": "1"
  },
  {
    "name": "name2",
    "id": "2"
  },
  {
    "name": "name4",
    "id": "4"
  },
  {
    "name": "name5",
    "id": "5"    
  }
]

我有另一个名为“a”的数组,它只有 id [1,2,3,4,5]。现在我必须将数组中的每个元素与 json 响应对象 id 进行比较。例如,数组“a”的第一个元素存在于 json 响应对象中,则应检索其各自的名称并将其存储在另一个名为“b”-> [name1] 的新数组中。数组“a”的第二个元素存在于 json 响应对象中,则应检索其各自的名称并将其附加到“b”数组 -> [name1,name2] 中。 json 响应对象中不存在数组“a”的第三个元素,因此没有名称。在这种情况下,应该在 b 数组中为该 id -> [name1,name2,0] 添加“0”而不是 name。数组“a”的第四个元素存在于 json 响应对象中,则应检索其各自的名称并将其附加到 b 数组 -> [name1,name2,0,name4] 中。数组“a”的第五个元素存在于json响应对象中,则应检索其各自的名称并将其附加到b数组中-> [name1,name2,0,name4,name5]。

我尝试通过以下代码来实现这一点。但我得到的不是 [name1,name2,0,name4,name5] ,而是 [name1,name2,name4,name5,0]

for (var i = 0; i < a.length; i++) {
    if (a.includes(jsonResponse[i].id)) {
        b.push(jsonResponse[i].name);
    }
    else{
       b.push("0"); 
   }
}

【问题讨论】:

  • 您正在循环遍历a 的索引,但将其用作jsonResponse 中的索引。
  • 是的。有没有其他办法?

标签: javascript arrays json


【解决方案1】:

你需要在整个jsonResponse数组中搜索b的每个元素,而不是只测试jsonResponse的当前索引。

使用.find() 查找具有您要查找的 ID 的元素。

let jsonResponse = [{
    "name": "name1",
    "id": "1"
  },
  {
    "name": "name2",
    "id": "2"
  },
  {
    "name": "name4",
    "id": "4"
  },
  {
    "name": "name5",
    "id": "5"
  }
];

let a = [1, 2, 3, 4, 5];

let b = a.map(id => {
  let found = jsonResponse.find(u => u.id == id);
  return found ? found.name : "0";
});

console.log(b);

【讨论】:

    【解决方案2】:

    您可以使用Map 集合来拥有O(1),同时在映射元素时访问所需的元素:

    let mapResponse = new Map(jsonResponse.map(s=> [+s.id, s.name]));
    const result = a.map(id => mapResponse.get(id) || '0')
    

    一个例子:

    let jsonResponse = [
        {
            "name": "name1",
            "id": "1"
        },
        {
            "name": "name2",
            "id": "2"
        },
        {
            "name": "name4",
            "id": "4"
        },
        {
            "name": "name5",
            "id": "5"
        }
    ];
    let a = [1, 2, 3, 4, 5];
    
    let mapResponse = new Map(jsonResponse.map(s=> [+s.id, s.name]));
    const result = a.map(id => mapResponse.get(id) || '0')
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多