【问题标题】:About javascript array关于 javascript 数组
【发布时间】:2022-01-14 04:19:55
【问题描述】:

我想最终得到以下结果。

[{x: '10', y: '5'}, {x: '8', y: '4'}]

我不明白为什么下面代码得到的结果是

[{x: '8', y: '4'}, {x: '8', y: '4'}]

var test =[["10", "5"],["8","4"]];
var series = {};
var sample = [];
for (var i = 0 ; i < test.length ; i++){
  series.x = test[i][0];
  series.y = test[i][1];
  console.log(i);
  console.log(series);
  sample.push(series);
};
console.log(sample);

你能给我一些建议吗?

【问题讨论】:

  • 您需要在循环的每个循环中创建一个新对象。您当前正在做的是在每个循环中更新相同的对象。您当前的结果是一个对象引用数组,全部指向同一个对象。
  • 在循环中:let series = { x: test[i][0], y: test[i][1] };
  • 知道了,对不起,我犯了一个粗心的错误。谢谢!!
  • 另外,考虑 1-liner:let sample = test.map(a =&gt; ({ x:a[0], y:a[1] }));
  • 这应该可以let sample = test.map(([x,y])) =&gt; ({ x, y }));

标签: javascript arrays


【解决方案1】:

series 是一个对象,您在循环中所做的基本上是两次更改series 成员的值并将series 推入sample 数组两次。 由于sample[0]sample[1]指向同一个对象,显然它们的成员是一样的,你可以用console.log(sample[0] === sample[1])来验证。

【讨论】:

    【解决方案2】:

    看起来您将同一对象(即系列)的引用推入数组(即样本)两次。这就是结果列表中的两个元素看起来相同的原因。您可能需要进行一些更改(见下文)以获得您想要的。

    var test =[["10", "5"],["8","4"]];
    var series; /* declare a new variable */
    var sample = [];
    for (var i = 0 ; i < test.length ; i++){
      series = {};  /* assign a new object */
      series.x = test[i][0];
      series.y = test[i][1];
      console.log(i);
      console.log(series);
      sample.push(series); /* push the reference of the new object for loop i */
    };
    console.log(sample);

    【讨论】:

      【解决方案3】:

      您好@shinobu,您犯了一个简单的错误,您没有清除对象内部的对象。我在代码中添加一行,它会解决它

      var test =[["10", "5"],["8","4"]];
      var series = {};
      var sample = [];
      for (var i = 0 ; i < test.length ; i++){
        series = {};
        series.x = test[i][0];
        series.y = test[i][1];
        sample.push(series);
      };
      console.log(sample);
      

      【讨论】:

        【解决方案4】:

        通过使用 ES6 数组方法中的reduce,您可以删除大部分代码并将其替换为以下代码:

        var test =[["10", "5"],["8","4"]];
        var result = test.reduce((acc, current) => {
            acc.push({x: current[0], y: current[1]});
            return acc;
        }, []);
        console.log(result);

        如果您对此有任何疑问,请告诉我!快乐的编码

        【讨论】:

          【解决方案5】:

          最干净的方法是使用map():

          var test = [["10", "5"],["8","4"]];
          var sample = test.map(([ x, y ]) => ({ x, y }));
          
          console.log(sample);


          关于您的原始代码as mentioned,您需要在循环内创建对象,因此您更改对第一个的引用:

          var test =[["10", "5"],["8","4"]];
          var sample = [];
          
          for (var i = 0 ; i < test.length ; i++){
            var series = {};
            series.x = test[i][0];
            series.y = test[i][1];
            sample.push(series);
          };
          console.log(sample);

          【讨论】:

            【解决方案6】:

            你可以使用扩展运算符

            var test = [["10", "5"], ["8", "4"]];
            var series = {};
            var sample = [];
            for (var i = 0; i < test.length; i++) {
             series.x = test[i][0];
             series.y = test[i][1];
             sample.push({ ...series });
            };
            console.log(sample);

            【讨论】:

              猜你喜欢
              • 2016-06-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-07
              • 2012-09-29
              • 2013-05-29
              • 1970-01-01
              • 2020-09-08
              相关资源
              最近更新 更多