【问题标题】:Making an exception when joining array's keys加入数组的键时出现异常
【发布时间】:2018-07-22 11:59:36
【问题描述】:

我想破例。我很难解释它,所以让我告诉你我的意思。

我的代码:

fruits = [ 
  {name: "apple",     energy: 100, not: "kiwi"}, 
  {name: "kiwi",      energy: 126, not: "orange"}, 
  {name: "banana",    energy: 150, not: ""}, 
  {name: "orange",    energy: 118, not: "peach"}, 
  {name: "pineapple", energy: 98,  not: ""}, 
  {name: "coconut",   energy: 83,  not: ""}, 
  {name: "peach",     energy: 65,  not: ""}, 
  {name: "lemon",     energy: 36,  not: ""} 
] 

const pick = (arr, n) => {
  const r = [];
  for (var i = 0; i < arr.length; i += n) {
    const slice = arr.slice(i, i+n);
    const name = slice.map(({name}) => name).join('-')
    const energy = slice.reduce((r, {energy}) => r + energy, 0);
    r.push({name, energy})
  }
  return r;
}

const result = pick(fruits, 2)
console.log(result)

我得到的结果是

{name: "apple-kiwi",        energy: 226},
{name: "banana-orange",     energy: 268},
{name: "pineapple-coconut", energy: 181},
{name: "peach-lemon",       energy: 101}

我想要的是做一个例外(fruits 中的not)。所以苹果不应该与猕猴桃链接,猕猴桃与橙子等链接,它应该看起来像这样

{name: "apple-banana",   energy: something},
{name: "kiwi-pineapple", energy: something},
...

我以为我可以过滤 slice 并检查其中是否有任何项目包含 not,但我失败了 :( 谁能帮帮我?

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

    你需要取一个名称数组和一个异常数组,并在交叉点处检查:

    fruits = [ 
      {name: "apple", energy: 100, not: "kiwi"}, 
      {name: "kiwi", energy: 126, not: "orange"}, 
      {name: "banana", energy: 150, not: ""}, 
      {name: "orange", energy: 118, not: "peach"}, 
      {name: "pineapple", energy: 98, not: ""}, 
      {name: "coconut", energy: 83, not: ""}, 
      {name: "peach", energy: 65, not: ""}, 
      {name: "lemon", energy: 36, not: ""} 
    ] 
    
    function intersect (a1, a2) {
      var isIntersect = false
      a1.forEach(function (a) {
        if (a.length > 0 && a2.indexOf(a) !== -1) isIntersect = true
      })
      return isIntersect
    }
    
    const pick = (arr, n) => {
      const r = [];
      for (var i = 0; i < arr.length; i += n) {
        const slice = arr.slice(i, i+n);
        const namesArr = slice.map(({name}) => name)
        const notsArr = slice.map(({not}) => not)
        
        if (!intersect(namesArr, notsArr)) {
          const name = namesArr.join('-')
          const energy = slice.reduce((r, {energy}) => r + energy, 0);
          r.push({name, energy})
        }
      }
      return r;
    }
    
    const result = pick(fruits, 2)
    console.log(result)

    【讨论】:

    • Array.some 更适合这种操作(intersect)
    【解决方案2】:

    其实你需要的是filter数组来选择不具有not属性值等于迭代item名称的元素:

    const pick = (arr, n) => {
      const r = [];
      for (var i = 0; i < arr.length; i += n) {
        var slice = [];
        slice.push(arr[i]);
        slice = slice.concat(arr.filter(function(x, ind) {
          return x.name !== arr[i].name && x.not !== arr[i].name
        }));
        slice = slice.slice(0, n);
        var name = slice.reduce((r, {
          name
        }) => r + name + "-", "");
        name = name.replace(/\-$/, '');
        const energy = slice.reduce((r, {
          energy
        }) => r + energy, 0);
        r.push({
          name,
          energy
        });
      }
      return r;
    }
    

    演示:

    var fruits = [{
        name: "apple",
        energy: 100,
        not: "kiwi"
      },
      {
        name: "kiwi",
        energy: 126,
        not: "orange"
      },
      {
        name: "banana",
        energy: 150,
        not: ""
      },
      {
        name: "orange",
        energy: 118,
        not: "peach"
      },
      {
        name: "pineapple",
        energy: 98,
        not: ""
      },
      {
        name: "coconut",
        energy: 83,
        not: ""
      },
      {
        name: "peach",
        energy: 65,
        not: ""
      },
      {
        name: "lemon",
        energy: 36,
        not: ""
      }
    ]
    
    const pick = (arr, n) => {
      const r = [];
      for (var i = 0; i < arr.length; i += n) {
        var slice = [];
        slice.push(arr[i]);
        slice = slice.concat(arr.filter(function(x, ind) {
          return x.name !== arr[i].name && x.not !== arr[i].name
        }));
        slice = slice.slice(0, n);
        var name = slice.reduce((r, {
          name
        }) => r + name + "-", "");
        name = name.replace(/\-$/, '');
        const energy = slice.reduce((r, {
          energy
        }) => r + energy, 0);
        r.push({
          name,
          energy
        });
      }
      return r;
    }
    
    const result = pick(fruits, 2)
    console.log(result)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多