【问题标题】:Combine array items from different properties in a JavaScript object在 JavaScript 对象中组合来自不同属性的数组项
【发布时间】:2015-01-25 15:33:21
【问题描述】:

我正在尝试创建一个函数,该函数将迭代一个数组对象,并返回一个数组,该数组将一个数组中的每个元素连接到其他数组中的每个元素:

像这样的对象:

kitchen = {
    food: [".bacon",".bananas"],
    drinks: [".soda",".beer"],
    apps: ['.fritters','.wings']
}

想要返回的数组:

[
 ".bacon.soda",".bacon.beer",
 ".bananas.soda",".bananas.beer",
 ".bacon.fritters",".bacon.wings",
 ".bananas.fritters",".bananas.wings", 
 ".soda.fritters",".soda.wings",
 ".beer.fritters",".beer.wings"
]

我很难思考如何实现这一点。我的一个想法是创建另一个对象并创建一个哈希,其中每个数组项都成为一个属性,然后循环遍历,所以我有类似的东西:

newObj = {
    ".bacon": [".soda",".beer",".fritters",".wings"]
    ".bananas": [".soda",".beer"...etc]
    etc...
}

然后循环遍历每个prop,将每个数组元素上的属性连接到一个新数组中?不知道这是否矫枉过正?

Plain JS 很好,但如果你也有一个 coffeescript 解决方案,那就太好了。

谢谢

【问题讨论】:

  • fritterswingsbananas.wings 前面没有点有什么原因吗?
  • 对不起,他们应该有点 - 刚刚更正了这个

标签: javascript arrays loops object


【解决方案1】:

这是一个使用 CoffeeScript 语法的解决方案(因为您要求提供 CoffeeScript 答案,然后又删除了该请求?):

kitchen = 
    food: [".bacon",".bananas"]
    drinks: [".soda",".beer"]
    apps: ['.fritters','.wings']

allGroups = Object.keys(kitchen).map (key) -> kitchen[key]

allValues = []
allGroups.forEach (group, i) ->
    otherValues = Array.prototype.concat.apply [], allGroups.slice(i + 1)
    group.forEach (v1) -> otherValues.forEach (v2) -> allValues.push(v1 + v2)

console.log(allValues)

这是纯 JS 版本:

var kitchen = {
  food: [".bacon", ".bananas"],
  drinks: [".soda", ".beer"],
  apps: ['.fritters', '.wings']
}

var allGroups = Object.keys(kitchen).map(function(key) {
  return kitchen[key];
});

var allValues = []
allGroups.forEach(function(group, i) {
  var otherValues = Array.prototype.concat.apply([], allGroups.slice(i + 1));
  group.forEach(function(v1) {
    otherValues.forEach(function(v2) {
      allValues.push(v1 + v2);
    });
  });
});

console.log(allValues)

【讨论】:

    【解决方案2】:

    试试这个:

    var result = [];
    var keys = Object.keys(kitchen);
    
    for (var i = 0; i < keys.length; i++) {
    
        kitchen[keys[i]].forEach(function(ingred1) {
            for (var j = i+1; j < keys.length; j++) {
    
                kitchen[keys[j]].forEach(function(ingred2) {
                    result.push(ingred1 + ingred2);
                });
            }
        });
    }
    
    console.log(result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多