从forEach中返回

时间:2016-10-26 20:41:17

标签: javascript

我天真地编写了以下函数,认为它可以帮助我找到一个深入数据结构的对象。但这不会起作用,因为返回的范围是在foreach中。该函数将始终返回undefined。我该怎么做?

"target": "es5",
"module": "commonjs",
"moduleResolution": "node"

3 个答案:

答案 0 :(得分:1)

我认为你的做法是错误的。这是......很多代码。我创建了一个似乎符合您正在查看的数据的对象:

var data = [
  {
    username: "Alice",
    userData : [
      {
        id: 1,
        someData: "hello"
      },
      {
        id: 2,
        someData: "world"
      }
    ]
  },
  {
    username: "Bob",
    userData : [
      {
        id: 3,
        someData: "apple"
      },
      {
        id: 4,
        someData: "orange"
      }
    ]
  }
];

const findStuff = (data, lookup) => {
  return data.find(
    item => item.userData.some(
      userDataItem => userDataItem.id === lookup.id
    )
  );
}

const shouldGetAlice     = findStuff(data, {id: 1});
const shouldBeAliceAgain = findStuff(data, {id: 2});
const shouldGetBob       = findStuff(data, {id: 3});
const shouldBeAnotherBob = findStuff(data, {id: 4});

console.log(shouldGetAlice.username);
console.log(shouldBeAliceAgain.username);
console.log(shouldGetBob.username);
console.log(shouldBeAnotherBob.username);

.find()开始,因为你想获得一个项目。

在回调中,您使用.some()检查userData属性,而不是自己循环浏览。

就是这样。您无需手动遍历每个阵列。

如果删除了描述性变量名称,则可以将该功能缩短为

const findStuff = (data, x) => {
   return data.find(u => u.userData.some(ud => ud.id === x.id));
}

它也可以写在一行,但似乎不太清楚。

答案 1 :(得分:0)

在闭包顶部使用变量,并在forEach之后返回。

const findStuff = (data, x) => {
    let found;

    data.forEach(u => {
        u.userData.forEach(ud => {
            const s = ud.stuff.find(s=>s.id === x.id);
            if (s){
                found = s;
            }
        });
    });

    return found;
};

答案 2 :(得分:0)

您可以使用Array#some并以返回KTL结束迭代。您需要一个变量用于找到的值。

true