然后拼接然后修改数组

时间:2015-11-29 12:22:47

标签: javascript arrays angularjs

所以我拼接了一个对象数组,首先要复制其中一个对象。这是因为有人想要“拆分”他们的订单,即为同一产品订购新订单但是发货日期不同。

无论如何,我所期望的是,假设传递的参数是“Daily Breads”和“Apple Streusel”,我在对象数组中得到第二个“Apple Streusel”,但是 printf ("CMD> "); // scanf ("%s",buffer); // better use fgets fgets( buffer, sizeof( buffer ), stdin ); char *args[3] = { NULL }; char *pch; pch = strtok (buffer," "); int i = 0; while (pch != NULL) { args[i++] = pch; pch = strtok (NULL, " "); } for( i = 0; i < 3; i++ ) { if( args[i] != NULL ) { printf( "args[%d] = %s\n", i, args[i] ); } } 应该成为“Apple Streusel Additional”。相反,我得到的是两个名为“Apple Streusel Additional”的对象,而不仅仅是一个。

我正在修改的JSON的相关部分:

.text

我的功能:

$scope.theBreadsList = [{
        category: 'Daily Breads',
        breads: [{
            text: 'Apple Streusel',
            category: 'Daily Breads',
            isDaily: true,
            price: 7.25,
            quantity: 0,
            days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"],
            daysNotAvailable: null,
            onMenu: true,
            canSlice: false,
            orderDates: [],
            ingredients: ["White Flour", "Honey", "Water", "Butter", "Brown Sugar", "Eggs", "Applesauce", "Apples", "White Sugar", "Yeast", "Spices", "Vanilla", "Salt"]
        },


        {
            text: 'Honey Whole Wheat',
            category: 'Daily Breads',
            isDaily: true,
            price: 5.65,
            quantity: 0,
            days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"],
            daysNotAvailable: null,
            onMenu: true,
            canSlice: true,
            orderDates: [],
            ingredients: ["Organic Whole Wheat Flour","Filtered Water","Honey","Yeast","Salt"],
        },

        {
            text: 'Peasant White',
            category: 'Daily Breads',
            isDaily: true,
            price: 5.65,
            quantity: 0,
            days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"],
            daysNotAvailable: null,
            onMenu: true,
            canSlice: true,
            orderDates: [],
            ingredients: ["Unbleached Unbromated White Flour", "Filtered Water","Honey","Yeast","Salt"]
        },

        {
            text: 'Rolls (White or Wheat)',
            category: 'Daily Breads',
            isDaily: true,
            price: 4.75,
            quantity: 0,
            days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"],
            daysNotAvailable: null,
            onMenu: true,
            canSlice: false,
            orderDates: []
        },

        {
            text: 'Seven Grain Crunch',
            category: 'Daily Breads',
            isDaily: true,
            price: 5.95,
            quantity: 0,
            days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"],
            daysNotAvailable: null,
            onMenu: true,
            canSlice: true,
            orderDates: [],
            ingredients: ["Freshly Milled Organic Whole Wheat Flour","Seven Grain Mix (Hard & Soft Wheat, Oats, Rye, Millet, Barley, Triticale)", "Filtered Water","Honey","Yeast","Salt"]
        },

        {
            text: 'Three Seed Healthy',
            category: 'Daily Breads',
            isDaily: true,
            price: 6.25,
            quantity: 0,
            days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"],
            daysNotAvailable: null,
            onMenu: true,
            canSlice: true,
            orderDates: [],
            ingredients: ["Organic Whole Wheat Flour","Honey","Filtered Water","Sunflower Seeds","Sesame Seeds","Flax Seeds","Yeast","Salt"]
        }]

我的电话:

function add2JSON(breadCategory,bread){
  for (var i = 0; i < $scope.theBreadsList.length; i++) {
                    if ($scope.theBreadsList[i].category === breadCategory) {
                      for (var z = 0; z < $scope.theBreadsList[i].breads.length; z++) {
                      if ($scope.theBreadsList[i].breads[z].text === bread) { 
                      //importante!
                      console.log(z);
                      $scope.theBreadsList[i].breads.splice(z, 0, $scope.theBreadsList[i].breads[z]);
                      console.log($scope.theBreadsList, $scope.theBreadsList[i].breads[z], $scope.theBreadsList[i].breads[z+1]);
                      $scope.theBreadsList[i].breads[z+1].text = $scope.theBreadsList[i].breads[z+1].text + " Additional";
                      $scope.theBreadsList[i].breads[z+1].onMenu = false;
                      return;
                      }
                      }
                }
            }
}

3 个答案:

答案 0 :(得分:3)

您正在修改在原始数组和修改数组中引用的对象的对象属性。

您需要深度复制插入的数组元素。当您使用AngularJS时,您可以使用angular.copy,如下所示:

替换此行:

$scope.theBreadsList[i].breads.splice(z, 0, 
    $scope.theBreadsList[i].breads[z]);

使用:

$scope.theBreadsList[i].breads.splice(z, 0,
    angular.copy($scope.theBreadsList[i].breads[z]));

答案 1 :(得分:0)

我会选择不同的方法。类似的东西:

var arr = $scope.theBreadsList; // just to ease the example  

function add2JSON(breadCategory, bread) {
  var cat = arr.filter(function(c) { return c.category === breadCategory; })[0];
  var originalBread;
  var isAdditional = cat.breads.some(function(b) {
    if (b.text === bread) {
      originalBread = b;
      return true;
    }
    return false;
  });

  if (isAdditional) {
    var newBread = Object.assign({}, originalBread, {
      text: originalBread.text + ' (Additional)'
    });
    cat.breads.push(newBread);
  } else {
    // TODO: implement the case where it not exists already
  }
}

add2JSON('Daily Breads', 'Apple Streusel');

查看此工作DEMO

答案 2 :(得分:0)

您可以使用

制作副本
c = JSON.parse(JSON.stringify(b));

并根据需要插入。

&#13;
&#13;
var $scope = {};
$scope.theBreadsList = [{ category: 'Daily Breads', breads: [{ text: 'Apple Streusel', category: 'Daily Breads', isDaily: true, price: 7.25, quantity: 0, days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"], daysNotAvailable: null, onMenu: true, canSlice: false, orderDates: [], ingredients: ["White Flour", "Honey", "Water", "Butter", "Brown Sugar", "Eggs", "Applesauce", "Apples", "White Sugar", "Yeast", "Spices", "Vanilla", "Salt"] }, { text: 'Honey Whole Wheat', category: 'Daily Breads', isDaily: true, price: 5.65, quantity: 0, days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"], daysNotAvailable: null, onMenu: true, canSlice: true, orderDates: [], ingredients: ["Organic Whole Wheat Flour", "Filtered Water", "Honey", "Yeast", "Salt"], }, { text: 'Peasant White', category: 'Daily Breads', isDaily: true, price: 5.65, quantity: 0, days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"], daysNotAvailable: null, onMenu: true, canSlice: true, orderDates: [], ingredients: ["Unbleached Unbromated White Flour", "Filtered Water", "Honey", "Yeast", "Salt"] }, { text: 'Rolls (White or Wheat)', category: 'Daily Breads', isDaily: true, price: 4.75, quantity: 0, days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"], daysNotAvailable: null, onMenu: true, canSlice: false, orderDates: [] }, { text: 'Seven Grain Crunch', category: 'Daily Breads', isDaily: true, price: 5.95, quantity: 0, days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"], daysNotAvailable: null, onMenu: true, canSlice: true, orderDates: [], ingredients: ["Freshly Milled Organic Whole Wheat Flour", "Seven Grain Mix (Hard & Soft Wheat, Oats, Rye, Millet, Barley, Triticale)", "Filtered Water", "Honey", "Yeast", "Salt"] }, { text: 'Three Seed Healthy', category: 'Daily Breads', isDaily: true, price: 6.25, quantity: 0, days: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday"], daysNotAvailable: null, onMenu: true, canSlice: true, orderDates: [], ingredients: ["Organic Whole Wheat Flour", "Honey", "Filtered Water", "Sunflower Seeds", "Sesame Seeds", "Flax Seeds", "Yeast", "Salt"] }] }];

function add2JSON(breadCategory, bread) {
    $scope.theBreadsList.forEach(function (a) {
        var c, p;
        if (a.category === breadCategory) {
            a.breads.some(function (b, i) {
                if (b.text === bread) {
                    p = i,
                    c = JSON.parse(JSON.stringify(b));
                    c.text += " Additional";
                    c.onMenu = false;
                    return true;
                }
            }) && a.breads.splice(p, 0, c);
        }
    });
}

add2JSON("Daily Breads", "Apple Streusel");
document.write('<pre>' + JSON.stringify($scope, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

相关问题