将值推送到JavaScript

时间:2015-06-13 17:13:23

标签: javascript arrays

我有和数组的数组看起来像这样:

var arr = [[1,2,3],[4,5,6],[7,8,9]];

之后我有一个数字列表和一个循环

var list = [15,10,11,14,13,12]

for (i=0; i<list.length; i++) { 

    var val = list[i];

    if (val >= 10 && val < 13) {
     arr[arr.length].push(val);   
    }
    else if (val >= 13 && val < 16) {
     arr[arr.length+1].push(val);   
    }
}

所以基本上我喜欢有一个看起来像这样的输出:

arr = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]];

使用此代码我收到错误&#34;无法读取属性&#39;推送&#39;未定义&#34;

同样重要的是我不能使用arr [3] .push或arr [4] .push,因为我的情况更复杂,我总是需要将值推送到新数组,这些数组将出现在我的阵列。无论我有多少物体。

4 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为arr[arr.length]始终为undefined

所以你基本上在做

undefined.push(x);
// Cannot read property 'push' of undefined

&#34;同样重要的是我无法使用arr [3] .push或arr [4] .push,因为我的情况更复杂,我总是需要将值推送到新数组将出现在我的数组上。无论我有多少物体。&#34;

此算法为code smell,如果您发布实际代码,我们可能会帮助您更好。

要了解我正在谈论的内容,请考虑以下代码

// your numbers in a random order
var xs = [7,10,2,15,4,9,14,1,8,12,5,11,3,6,13];

// sort them
xs.sort(function(a, b) { return a-b; });

// define a function that "chunks" a list into smaller parts
function chunk(xs, n) {
  function iter(ys, y, xs) {
    if (y.length === 0) return ys;
    return next(ys.concat([y]), xs);
  }
  function next(ys, xs) {
    return iter(ys, xs.slice(0,n), xs.slice(n));
  }
  return next([], xs);
}

// call our function on your sorted list
var ys = chunk(xs, 3);

console.log(JSON.stringify(ys));
//=> [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]]

答案 1 :(得分:2)

def self.find_or_create(id, current_user) cart = Cart.where(referral_guid: nil, id: id).first if !priority_cart?(cart) && !current_user.nil? cart = Cart.where(referral_guid: current_user.referral_guid).order("id DESC").first end cart.update_cart_with_referral_guid(current_user) unless current_user.nil? cart = Cart.create unless cart ##### test 1 ##### puts("cart.inspect: #{cart.inspect}") #<Cart id: 2, created_at: "2015-06-13 17:39:57", updated_at: "2015-06-13 17:39:57", price_total: nil, tax: nil, referral_guid: nil> puts("cart.present?: #{cart.present?}") #false puts("cart.blank?: #{cart.blank?}") #true ##### test 2 ##### find_test = Cart.find(cart.id) puts("find_test.inspect: #{find_test.inspect}") #<Cart id: 2, created_at: "2015-06-13 17:39:57", updated_at: "2015-06-13 17:39:57", price_total: nil, tax: nil, referral_guid: nil> puts("find_test.present?: #{find_test.present?}") #false puts("find_test.blank?: #{find_test.blank?}") #true cart end 永远不会返回任何有意义的内容,请考虑一下:如果你有一个长度为6的数组,那么你可以使用索引0..5。 arr [6]将永远返回undefined,因为那里什么也没有。

你可能需要这样的东西:

arr[arr.length]

答案 2 :(得分:0)

如果您正在查找数组元素,那么您的代码将无效。请参考下面的代码对元素进行排序,它也将解决您未定义的问题。

<script>
var arr = [[1,2,3],[4,5,6],[7,8,9]];
var list = [15,10,11,14,13,12];
var arr1=[];
var arr2=[];

for (i=0; i<list.length; i++) {

    var val = list[i];

    if (val >= 10 && val < 13) {
     arr1.push(val);
    }
    else if (val >= 13 && val < 16) {
     arr2.push(val);
    }

}
arr1.sort(function(a, b){return a-b});
arr.push(arr1);
arr2.sort(function(a, b){return a-b});
arr.push(arr2);
console.log(arr);
</script>

答案 3 :(得分:0)

你需要这样的东西:

&#13;
&#13;
using System;
using Gtk;
using System.Threading;
using System.Diagnostics;
using System.Timers;

public partial class MainWindow: Gtk.Window
{
    Stopwatch stopwatch = new Stopwatch();
    System.Timers.Timer timer  = new System.Timers.Timer();
    bool stopClicked = false;

    public MainWindow () : base (Gtk.WindowType.Toplevel)
    {
        Build ();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Gtk.Application.Quit ();
        a.RetVal = true;
    }

    protected void OnStartButtonClicked (object sender, EventArgs e)
    {
        Thread thread1 = new Thread(new ThreadStart(Thread1));
        thread1.Start ();
        stopwatch.Start ();
        Console.WriteLine ("Stopwatch started");

        timer.Elapsed += new ElapsedEventHandler (timerTick);
        timer.Interval = 100;
        timer.Enabled = true;
        timer.Start ();
        Console.WriteLine ("Timer started");
    }

    protected void OnStopButtonClicked (object sender, EventArgs e)
    {
        stopClicked = true;
    }

    void timerTick(object sender, EventArgs e)
    {
        timeLabel.Text = stopwatch.Elapsed.ToString ();
        System.Windows.Forms.Application.DoEvents ();
    }

    void Thread1()
    {
        if(stopClicked)
        {
            timeLabel.Text = stopwatch.Elapsed.ToString ();
            timer.Stop ();
            timer.Enabled = false;
            timer.Dispose ();
            Console.WriteLine ("Timer stopped");
            stopwatch.Stop ();
            Console.WriteLine ("Stopwatch stopped");
        }
     }
 }
&#13;
&#13;
&#13;