首页 > 解决方案 > 在 $.each 中的数组中推送对象

问题描述

也许我只是瞎了眼,但我现在挣扎了很长时间:

我在这里有一小段 JS 代码:

var linkInput = $('#Link input.gwt-TextBox').val();
var parentRow = $('#Link').parent().parent();
var links = linkInput.split("|");

// hide text-input
$(parentRow).hide();

// get rid of empty elements
links = links.filter(Boolean);

var aSites = [];
var oSite = {};

$(links).each(function (k, v) {

    splits = v.split(".");
    domainName = splits[1];
    oSite.name = domainName;
    oSite.url = v;
    aSites.push(oSite);
});

console.log(aSites);

指定:获取一个input-field 的值,然后隐藏该行并将所有值保存在一个对象中,然后将其推送到一个数组中。

该参数取自谷歌浏览器的控制台选项卡:

var links = ["www.myshop1.de/article/1021581", "https://www.myshop2.de/article/1021581"] [type: object]

我想,我遍历这个对象的所有元素(在这种情况下是 2 次),将值推送到一个对象中,然后将对象推送到一个数组中,以便之后可以访问所有这些元素。

然而,在某些时候,我似乎覆盖了我以前的值,因为我的输出如下所示:

0: {name: "myshop1", url: "https://www.myshop1.de/1021581"}
1: {name: "myshop2", url: "https://www.myshop2.de/1021581"}
length: 2
__proto__: Array(0)

我的错误在哪里?有没有更聪明的方法来实现这一点?

在旁注中:

我试图只使用一个数组(不添加对象),但似乎我不能使用这样的关联键:

var myKey = "foo";
var myValue = "bar";
myArray[myKey] = myValue

标签: javascriptjquery

解决方案


你应该移动这个:

var oSite = {};

...在each它下面的回调中,因为您在每次迭代中都需要一个新对象。

否则,您将一次又一次地改变同一个对象,将同一个对象反复推入aSites数组,最终导致对同一个对象的多个引用。

不相关,但您可以$.map用来创建您的数组(或 vanilla JS links.map()):

var aSites = $.map(links, function(v) {
    return { name: v.split(".")[1], url: v };
});

推荐阅读