【问题标题】:How to change key value based on comparison of array of objects in jQuery?如何根据jQuery中对象数组的比较来更改键值?
【发布时间】:2020-07-20 12:17:50
【问题描述】:

我在 jQuery 中有两个数组,如下所示。

var arr1 = [{A: "t1"},{A: "t3"}];

var arr2 = [{A: "t1",B:""},{A: "t2",B:""},{A: "t3",B:""},{A: "t4",B:""},{A: "t5",B:""},{A: "t6",B:""}];

var arr3 = []; //Only for output

现在,arr3 中的输出应该是:

  • arr2 中的所有值
  • 如果“A”键存在,“B”键应该是Yes 在 arr1
  • 如果“A”键不存在,“B”键应该是No 在 arr1

所以,我想要在 arr3 中的输出应该是:

arr3 = [{A: "t1",B:"Yes"},{A: "t2",B:"No"},{A: "t3",B:"Yes"},{A: "t4",B:"No"},{A: "t5",B:"No"},{A: "t6",B:"No"}];

这是我迄今为止尝试过的

var arr1 = [{A: "t1"},{A: "t3"}];
var arr2 = [{A: "t1",B:""},{A: "t2",B:""},{A: "t3",B:""},{A: "t4",B:""},{A: "t5",B:""},{A: "t6",B:""}];
var arr3 = []; //Only for output

arr1.forEach(function(x) {
  arr2.forEach(function(y) {
    if (x.A == y.A) {
      arr3.push({
        A: x.A,
        B: "Yes"
      });
    } else {
      arr3.push({
        A: x.A,
        B: "No"
      });
    }
  });
});

console.log(arr3);
//Output
0: {A: "t1", B: "Yes"}
1: {A: "t1", B: "No"}
2: {A: "t1", B: "No"}
3: {A: "t1", B: "No"}
4: {A: "t1", B: "No"}
5: {A: "t1", B: "No"}
6: {A: "t3", B: "No"}
7: {A: "t3", B: "No"}
8: {A: "t3", B: "Yes"}
9: {A: "t3", B: "No"}
10: {A: "t3", B: "No"}
11: {A: "t3", B: "No"}

这里的问题是它对 arr1 中的每个项目重复,并且计数加倍。 我知道它应该在 if 和 else 之间的某个地方中断,这样它就不会重复。

我也试过检查下面的链接,但没有得到太多帮助。

filter array of objects based on separate object keys, values

js - How to change one key's value based on another key's value in array of objects

Object comparison based on keys

compare array of objects

提前致谢。

【问题讨论】:

  • 感谢您提出一个非常完整的问题
  • 感谢编辑,我不知道如何将其添加为 sn-p。
  • 这个按钮看起来像[<>]
  • 这些数组可以变成多长时间?如果时间不长你可以做arr1.find(o => o.A===x.A);
  • 确实,大于5000

标签: jquery arrays compare key key-value


【解决方案1】:

使用 map 查找数组是否很大。

保存reduce和push

var arr1 = [{ A: "t1" }, { A: "t3" }];
var arr2 = [{ A: "t1", B: ""}, { A: "t2", B: "" }, { A: "t3", B: "" }, { A: "t4", B: "" }, { A: "t5", B: "" }, { A: "t6", B: "" }];
var arr3 = arr2.map(
  item2 => ({
    A: item2.A,
    B: arr1.find(item1 => item1.A === item2.A) ? 'Yes' : 'No'
  }));

console.log(arr3);

【讨论】:

    【解决方案2】:

    您可以使用Array.reduce() 在arr1 中创建一个A 值数组,然后使用Array.includes 检查arr2 中的每个A 值是否存在于该数组中,使用决定是否将B设置为Yes或No:

    var arr1 = [{ A: "t1" }, { A: "t3" }];
    var arr2 = [{ A: "t1", B: ""}, { A: "t2", B: "" }, { A: "t3", B: "" }, { A: "t4", B: "" }, { A: "t5", B: "" }, { A: "t6", B: "" }];
    var arr3 = []; //Only for output
    
    var arr1values = arr1.reduce((c, v) => c.concat([v.A]), []);
    
    arr2.forEach(function(y) {
      arr3.push({
        A: y.A,
        B: arr1values.includes(y.A) ? 'Yes' : 'No'
      });
    });
    
    console.log(arr3);

    【讨论】:

    • 太棒了,这就像一个魅力。 Array.reduce() 和 Array.includes 是我今天学到的新东西。非常感谢。
    • @fatfoodiepanda 不用担心 - 我很高兴能提供帮助。
    • 在 5000 个项目的基准测试中比较我们的两个答案会很有趣
    • @mplungjan 确实如此。我想这很大程度上取决于includes 是否比find 快足以弥补reduce。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多