【问题标题】:Javascript - iterating and deleting from objectJavascript - 从对象中迭代和删除
【发布时间】:2016-04-26 10:47:30
【问题描述】:

我有以下对象

familyData: [
                    { man: 1, woman:10, daughter:6, son:3 },
                    { man: 4 woman:5, daughter:5, son:2 },
                    { man: 1, woman:1, daughter:1, son:1 },
                    { man: 1, woman:1, daughter:1, son:1 },
                    { man: 1, woman:1, daughter:1, son:1 },
                    ],

我要做的是从每个索引中删除 1,但是减法的数量是用户提交的。

让我解释一下……

如果用户插入一个 2. 1 会从对象中的前 2 个索引中取出

 { man: 0, woman: 9, daughter:6, son:3 },
 { man: 3 woman:4, daughter:5, son:2 },

如果用户插入一个 4. 1 将从对象中的前 4 个索引中取出

 { man: 0, woman: 9, daughter:5, son:2 },
 { man: 3 woman:4, daughter:4, son:1 },

我尝试了各种 for 和 do-while 循环,但似乎无法解决。

【问题讨论】:

  • 请向我们展示您的尝试,即使它们失败了。
  • JavaScript 对象没有固有的属性“顺序”。您想如何分配要从中删除值的项目?
  • 它是否低于零?它是否应用于数组的所有元素?

标签: javascript object subtraction cumulative-sum


【解决方案1】:

试试:

var indexes = 0;
for (var i=0; i<familyData.length; ++i) {
    for (var key in familyData[i]) {
        if (++indexes < 4 && familyData[i][key]) {
            familyData[i][key]--;
        }
    }
}

【讨论】:

  • 我喜欢这个答案,主要是因为它是最直接的。感谢大家的回复。
【解决方案2】:

试试这个

    var input = ..... user input;

    if(input>0){
    for(var i=0; i<familyData.length; i++){
        var item = familyData[i];
        var  counter=0;
        for(prop in item)
        {
            item[prop]=item[prop]-1;
            counter++;
            if(counter==input)
            {
                break;
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    我的解决方案:

    var userValue = 4;
        for (var i = 0; i < familyData.length; i++) {
          var counter = userValue;
          for (var x in familyData[i]) {
            if (!counter--) break;
            familyData[i][x]--;
          }
        }
    

    【讨论】:

      【解决方案4】:

      对于订单的固定数组,您可以使用此函数,它遍历数组和所需属性的键,如果达到数量,则短路。

      function decrement(n) {
          familyData.forEach(function (a) {
              order.every(function (k, i) {
                  if (i < n) {
                      a[k]--;
                      return true;
                  }
              });
          });
      }
      
      var familyData = [{ man: 1, woman: 10, daughter: 6, son: 3 }, { man: 4, woman: 5, daughter: 5, son: 2 }, { man: 1, woman: 1, daughter: 1, son: 1 }, { man: 1, woman: 1, daughter: 1, son: 1 }, { man: 1, woman: 1, daughter: 1, son: 1 }],
          order = ['man', 'woman', 'daughter', 'son'];
      
      decrement(3);
      document.write('<pre>' + JSON.stringify(familyData, 0, 4) + '</pre>');

      【讨论】:

        【解决方案5】:

        这可以解决问题,但我一生都无法尝试准确地命名该函数。

        function soAnswer(index, arr) {
          var keys = Object.keys(arr[0]);
        
          if (index >= keys.length || index < 0) {
            throw new Error('soAnswer was given an invalid index for given array');
          }
        
          keys = keys.slice(0, index);
        
          return arr.map(function (v) {
            keys.forEach(function (vv) {
              v[vv] -= 1;
            });
        
            return v;
          });
        }
        
        var outcome = soAnswer(3, familyData);
        

        【讨论】:

          【解决方案6】:

          您可以使用 Array.slice、Array.map 和 Array.concat

          var num = 2
          familyData.slice(0,num).map(function(members) {
             for(var name in members) {
               members[name]--
             }
             return members
          }).concat(familyData.slice(num))
          

          现场示例:https://tonicdev.com/lipp/family

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-01
            • 2017-07-07
            • 2020-07-30
            • 1970-01-01
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 2019-02-12
            相关资源
            最近更新 更多