【问题标题】:How to add objects into an array without repeating value of one of the properties of objects in JavaScript?如何在不重复 JavaScript 中对象属性之一的值的情况下将对象添加到数组中?
【发布时间】:2023-04-06 02:50:01
【问题描述】:

我正在尝试将数据插入到数组中。数据是具有 2 个属性名称和值的对象形式。我正在从具有完全不同结构的不同数组对象中检索数据。

我正在创建的新数组如下:

newarray = [Object, Object, Object]

在哪里Object = {name: "abc", value: "12"}

这就是我的目的:

var newarray = [];
for (var i = 0; i < oldarray.length; i++) {
    a = newarray.indexOf(oldarray[i].studentname);
    if (a == -1) {
        newarray.push({
            name: oldarray[i].studentname,
            value: oldarray[i].marks
        })
    }
}

我不希望学生姓名重复,因此我尝试使用 indexOf 检查名称在数组中的出现。但我没有正确地做到这一点。我做错了什么?

【问题讨论】:

  • 很明显英语不是你的母语(这绝对没问题不需要完美的英语),所以我会提到: 在问题的末尾说“请纠正”对于大多数英语读者来说是非常粗鲁的。 (即使是在印度次大陆方言中常见且完美的“请检查”对美国人来说也是粗鲁的。)
  • “不正确”是什么意思?说什么是错的。理想情况下,显示一个示例数组、您想要的输出以及您得到的输出。

标签: javascript arrays javascript-objects indexof


【解决方案1】:
var newarray= [];
for(var i=0; i<oldarray.length; i++)
{
    var found = false;
    for (var j=0; j<newarray.length; j++) {
      if (oldarray[i].studentname == newarray[j].studentname) {
        found = true;
        break;
      }
    }
    if(!found)
    {
        newarray.push({
            name : oldarray[i].studentname,
            value :oldarray[i].marks
        });
    }
}

【讨论】:

    【解决方案2】:

    这段代码:

    a = newarray.indexOf(oldarray[i].studentname);
    if (a == -1)
    

    查看学生的 name 是否是数组中的条目。但是您放入数组中的条目不仅仅是名称,它们是对象。

    如果要查找数组中是否有同名对象,可以使用Array#some

    if (!newarray.some(function(entry) { return entry.name == oldarray[i].studentname; })) {
        // It's not there, add it
    }
    

    Array#some 为每个条目调用其回调。如果回调为任何条目返回真值,some 停止并返回true;如果回调从不返回真值(或数组为空),some 返回false

    如果你使用的是 ES2015,使用 ES2015 会更简洁:

    if (!newarray.some(entry => entry.name == oldarray[i].studentname)) {
        // It's not there, add it
    }
    

    == 当然会要求名称的大小写相同。如果这可能不是真的,您可能需要先使两边都小写(或大写)。


    我没有在任何地方看到 a 声明,请确保您没有成为 The Horror of Implicit Globals 的牺牲品。

    【讨论】:

      【解决方案3】:

      var newarray = [];
      for (var i = 0; i < oldarray.length; i++) {
        a = findWithAttr(newarray, "studentname", oldarray[i].studentname);
        if (a == undefined) {
          newarray.push({
            name: oldarray[i].studentname,
            value: oldarray[i].marks
          })
        }
      }
      
      function findWithAttr(array, attr, value) {
        for (var i = 0; i < array.length; i += 1) {
          if (array[i][attr] === value) {
            return i;
          }
        }
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 2014-08-29
        • 2015-11-15
        • 1970-01-01
        • 2021-03-24
        • 2019-08-21
        • 1970-01-01
        相关资源
        最近更新 更多