循环遍历JS对象以返回值

时间:2017-11-16 02:49:39

标签: javascript algorithm object javascript-objects

我有一个充满鲑鱼的物体。我想循环检查鲑鱼是新鲜还是冷冻。如果冷冻,不要堆放,如果新鲜,放入是堆。如果盎司小于2且大于6,则没有堆积,如果它匹配2-6,则堆积。

然后,使用yes堆,我想循环遍历这些键和值以找到最便宜的一个,并将其打印出来。

这是我到目前为止所做的事情,但我似乎一直在循环通过大对象来运行检查。

我该怎么做?

function findSalmon(salmonInStore){
  var noPile, 
      yesPile; 
      var salmon = Object.keys(salmonInStore));
  for(var key in salmonInStore){

    if(salmonInStore.key.freshness !== 'fresh'){
      noPile.push(salmonInStore.key);
    } else {
      yesPile.push(salmonInStore.key);
    }
    if(salmonInStore.key.ounces < 2 && salmonInStore.key.ounces > 6){
      noPile.push(key);
    }else {
      yesPile.push(salmonInStore.key);
    }
  }
  return yesPile;
}

var salmonInStore = {
  salmon1 : {
    ounces: 1,
    freshness: 'frozen',
    price: 16
  },

 salmon2 : {
    ounces: 6,
    freshness: 'fresh',
    price: 10
  },

  salmon3 : {
    ounces: 2,
    freshness: 'frozen',
    price: 20
  },

  salmon4 : {
    ounces: 5,
    freshness: 'fresh',
    price: 1
  },

  salmon5 : {
    ounces: 3,
    freshness: 'frozen',
    price: 12
  }
}

findSalmon(salmonInStore);

3 个答案:

答案 0 :(得分:2)

function findSalmon(salmonInStore){
var yesPile = [];
var noPile = [];
Object.keys(salmonInStore).forEach( (key)=> {
  var salmon = salmonInStore[key]

  if (salmon.freshness !== 'fresh' || salmon.ounces < 2 && salmon.ounces > 6){
    noPile.push(key);
  } else {
    yesPile.push(key);
  }
})
return yesPile;
}

答案 1 :(得分:2)

首先,我们可以按价格对鲑鱼清单进行排序。

const salmonList = Object.keys(salmonInStore)
  .map(key => salmonInStore[key])
  .sort((a,b) => {
    if (a.price < b.price)
      return -1;
    if (a.price > b.price)
      return 1;

    return 0;
});

然后我们可以过滤掉是鱼。

const yesPile = salmonList.filter((salmon) => {
 return salmon.ounces >= 2 && salmon.ounces <= 6 && salmon.freshness === 'fresh';
});

yesPile[0] // cheapest fish

查看小提琴的工作示例。

https://jsfiddle.net/y1jg01wy/

答案 2 :(得分:1)

  

为了运行检查,我似乎停留在循环大对象上。

对象也称为键/值对。

您可以使用Object.keys获取对象的键。从那时起,您需要使用bracket notation 嵌套循环和动态值访问,以根据您使用时获得的密钥获取ak / v对的值{1}}。

以下是一个例子:

&#13;
&#13;
Object.keys
&#13;
&#13;
&#13;

但是如果你计划拥有任意的嵌套级别 - 不只是1级,你需要一个递归函数来走你的鲑鱼。

以上可以更具功能性&#39;使用var salmonInStore = { salmon1 : { ounces: 1, freshness: 'frozen', price: 16 }, salmon2 : { ounces: 6, freshness: 'fresh', price: 10 } } Object.keys(salmonInStore).forEach(storeKey => { var salmon = salmonInStore[storeKey] // put per salmon logic here... Object.keys(salmon).forEach(salmonKey => { var value = salmon[salmonKey] // value for each key console.log(value) // put per salmon value logic here... }) })代替reduce,但这是另一个故事。

上述要点是您需要forEachObject.keys。我为了简洁起见,用someObj[key]替换了for..循环。